百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT技术 > 正文

从Java到Swift学习指南(上篇)

wptr33 2025-03-08 01:01 16 浏览

一、变量与常量

1.1 基本声明对比

// Java
String name = "Java";
final int MAX_COUNT = 100; // 常量
// Swift
var name = "Swift"       // 可变变量(类型推断为String)
let maxCount = 100       // 常量(类型推断为Int)

核心差异

  • 类型后置:Swift 支持显式类型标注 var age: Int = 25,但通常使用类型推断
  • 不可变性优先级:优先使用 let(类似Java final),var 仅在需要时使用
  • 类型严格性:Swift 是强类型语言,var x = 1 之后不能赋值为字符串

1.2 基础数据类型

Java

Swift

说明

int

Int

统一大小写

double

Double


boolean

Bool

值必须为 true/false

char

Character

Unicode 字符

String

String

值类型(Swift中为结构体)

代码示例

let isActive: Bool = true        // 明确类型标注
var temperature = 36.5           // 推断为Double
let emoji: Character = ""      // 单个字符

二、字符串处理

2.1 字符串插值

// Java
String name = "Tim";
int age = 30;
System.out.println("Name: " + name + ", Age: " + age);
// Swift
let name = "Tim"
let age = 30
print("Name: \(name), Age: \(age)")  // 直接嵌入表达式

优势

  • 支持任意表达式:print("Next year: \(age + 1)")
  • 自动类型转换:无需显式调用 toString()

三、可选类型(Optionals)

3.1 本质对比

// Java Optional
Optional optionalName = Optional.ofNullable(getName());
String name = optionalName.orElse("Unknown");
// Swift Optionals
var optionalName: String? = getName()
let name = optionalName ?? "Unknown" // 空合并运算符

关键差异

  • 语法深度集成:Swift 用 ? 直接标记可选类型,而非泛型包装器
  • 强制解包风险:let value = optionalName!(类似Java optionalName.get())
  • 可选绑定:安全解包方式
  if let safeName = optionalName {
      print("Name is \(safeName)")
  }

四、集合类型

4.1 数组对比

// Java ArrayList
List numbers = new ArrayList<>();
numbers.add(1);
numbers.add(2);
int first = numbers.get(0);
// Swift Array
var numbers = [1, 2]        // 类型推断为[Int]
numbers.append(3)           // 添加元素
let first = numbers[0]      // 访问元素

4.2 字典对比

// Java HashMap
Map ages = new HashMap<>();
ages.put("Alice", 30);
int aliceAge = ages.get("Alice");
// Swift Dictionary
var ages = ["Alice": 30, "Bob": 28]  // 类型推断为[String: Int]
ages["Charlie"] = 25                // 添加键值对
let aliceAge = ages["Alice"] ?? 0   // 返回Optional值

核心特性

  • 值类型语义:Swift 集合类型是结构体,赋值时复制(Copy-on-Write优化)
  • 类型统一:[Int] 等价于 Array,[String: Int] 等价于 Dictionary

五、控制流

5.1 循环语句

// Java for循环
for (int i=0; i<5; i++) {
    System.out.println(i);
}

for (String name : names) {
    System.out.println(name);
}
// Swift for-in
for i in 0..<5 {            // 半开区间(不包含5)
    print(i)
}

for name in names {
    print(name)
}

// 带步长
for i in stride(from: 0, to: 10, by: 2) {
    print(i) // 0,2,4,6,8
}

5.2 Switch语句

// Java switch
int value = 2;
switch (value) {
    case 1: System.out.println("One"); break;
    case 2: System.out.println("Two"); break;
    default: System.out.println("Other");
}
// Swift switch(更强大)
let value = 2
switch value {
case 1, 3, 5:     // 复合匹配
    print("Odd")
case 2...4:       // 区间匹配
    print("Even")
case let x where x > 10: // Where条件
    print("Large")
default:
    break         // 必须穷举所有可能
}

六、函数与闭包

6.1 函数定义对比

// Java方法
public static int add(int a, int b) {
    return a + b;
}
// Swift函数
func add(_ a: Int, b: Int) -> Int {
    return a + b
}
// 调用:add(5, b: 3) → 参数标签设计

关键特性

  • 参数标签:支持外部标签与内部名称分离
  func sendMessage(to recipient: String, from sender: String) { ... }
  sendMessage(to: "Alice", from: "Bob")
  • 元组返回
  func getPoint() -> (x: Int, y: Int) {
      return (10, 20)
  }
  let point = getPoint()
  print(point.x) // 10

6.2 闭包 vs Lambda

// Java Lambda
List numbers = Arrays.asList(1,2,3);
numbers.stream()
       .filter(n -> n % 2 == 0)
       .forEach(System.out::println);
// Swift闭包
let numbers = [1,2,3]
numbers.filter { $0 % 2 == 0 }
       .forEach { print($0) }

// 完整闭包语法
numbers.sorted(by: { (a: Int, b: Int) -> Bool in
    return a > b
})

闭包特性

  • 尾随闭包:当闭包是最后一个参数时,可写在括号外
  • 简写参数:$0 表示第一个参数
  • 逃逸闭包:用 @escaping 标记可能异步执行的闭包

七、错误处理

7.1 对比体系

// Java受检异常
public void readFile() throws IOException {
    // 可能抛出异常的操作
}
// Swift错误处理
enum FileError: Error {
    case notFound
    case permissionDenied
}

func readFile() throws -> String {
    guard exists else { throw FileError.notFound }
    return "Content"
}

// 调用处
do {
    let content = try readFile()
} catch FileError.notFound {
    print("文件不存在")
} catch {
    print("其他错误:\(error)")
}

关键区别

  • 错误类型:Swift 错误是遵守 Error 协议的类型(通常是枚举)
  • 不强制处理:除非使用 try! 或 try?,否则必须用 do-catch
  • defer语句:类似Java finally
  func processFile() {
      let file = openFile()
      defer { file.close() } // 在函数返回前执行
      // 处理文件
  }

上篇总结练习

// 综合练习:实现安全除法函数
func safeDivide(_ a: Double, _ b: Double) -> Double? {
    guard b != 0 else {
        return nil
    }
    return a / b
}

// 使用if-let解包
if let result = safeDivide(10, 2) {
    print("结果:\(result)")
} else {
    print("除数不能为零")
}

相关推荐

每天一个编程技巧!掌握这7个神技,代码效率飙升200%

“同事6点下班,你却为改BUG加班到凌晨?不是你不努力,而是没掌握‘偷懒’的艺术!本文揭秘谷歌工程师私藏的7个编程神技,每天1分钟,让你的代码从‘能用’变‘逆天’。文末附《Python高效代码模板》,...

Git重置到某个历史节点(Sourcetree工具)

前言Sourcetree回滚提交和重置当前分支到此次提交的区别?回滚提交是指将改动的代码提交到本地仓库,但未推送到远端仓库的时候。...

git工作区、暂存区、本地仓库、远程仓库的区别和联系

很多程序员天天写代码,提交代码,拉取代码,对git操作非常熟练,但是对git的原理并不甚了解,借助豆包AI,写个文章总结一下。Git的四个核心区域(工作区、暂存区、本地仓库、远程仓库)是版本控制的核...

解锁人生新剧本的密钥:学会让往事退场

开篇:敦煌莫高窟的千年启示在莫高窟321窟的《降魔变》壁画前,讲解员指着斑驳色彩说:"画师刻意保留了历代修补痕迹,因为真正的传承不是定格,而是流动。"就像我们的人生剧本,精彩章节永远...

Reset local repository branch to be just like remote repository HEAD

技术背景在使用Git进行版本控制时,有时会遇到本地分支与远程分支不一致的情况。可能是因为误操作、多人协作时远程分支被更新等原因。这时就需要将本地分支重置为与远程分支的...

Git恢复至之前版本(git恢复到pull之前的版本)

让程序回到提交前的样子:两种解决方法:回退(reset)、反做(revert)方法一:gitreset...

如何将文件重置或回退到特定版本(怎么让文件回到初始状态)

技术背景在使用Git进行版本控制时,经常会遇到需要将文件回退到特定版本的情况。可能是因为当前版本出现了错误,或者想要恢复到之前某个稳定的版本。Git提供了多种方式来实现这一需求。...

git如何正确回滚代码(git命令回滚代码)

方法一,删除远程分支再提交①首先两步保证当前工作区是干净的,并且和远程分支代码一致$gitcocurrentBranch$gitpullorigincurrentBranch$gi...

[git]撤销的相关命令:reset、revert、checkout

基本概念如果不清晰上面的四个概念,请查看廖老师的git教程这里我多说几句:最开始我使用git的时候,我并不明白我为什么写完代码要用git的一些列指令把我的修改存起来。后来用多了,也就明白了为什么。gi...

利用shell脚本将Mysql错误日志保存到数据库中

说明:利用shell脚本将MYSQL的错误日志提取并保存到数据库中步骤:1)创建数据库,创建表CreatedatabaseMysqlCenter;UseMysqlCenter;CREATET...

MySQL 9.3 引入增强的JavaScript支持

MySQL,这一广泛采用的开源关系型数据库管理系统(RDBMS),发布了其9.x系列的第三个更新版本——9.3版,带来了多项新功能。...

python 连接 mysql 数据库(python连接MySQL数据库案例)

用PyMySQL包来连接Python和MySQL。在使用前需要先通过pip来安装PyMySQL包:在windows系统中打开cmd,输入pipinstallPyMySQL ...

mysql导入导出命令(mysql 导入命令)

mysql导入导出命令mysqldump命令的输入是在bin目录下.1.导出整个数据库  mysqldump-u用户名-p数据库名>导出的文件名  mysqldump-uw...

MySQL-SQL介绍(mysql sqlyog)

介绍结构化查询语言是高级的非过程化编程语言,允许用户在高层数据结构上工作。它不要求用户指定对数据的存放方法,也不需要用户了解具体的数据存放方式,所以具有完全不同底层结构的不同数据库系统,可以使用相同...

MySQL 误删除数据恢复全攻略:基于 Binlog 的实战指南

在MySQL的世界里,二进制日志(Binlog)就是我们的"时光机"。它默默记录着数据库的每一个重要变更,就像一位忠实的史官,为我们在数据灾难中提供最后的救命稻草。本文将带您深入掌握如...