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

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

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

一、变量与常量

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("除数不能为零")
}

相关推荐

redis的八种使用场景

前言:redis是我们工作开发中,经常要打交道的,下面对redis的使用场景做总结介绍也是对redis举报的功能做梳理。缓存Redis最常见的用途是作为缓存,用于加速应用程序的响应速度。...

基于Redis的3种分布式ID生成策略

在分布式系统设计中,全局唯一ID是一个基础而关键的组件。随着业务规模扩大和系统架构向微服务演进,传统的单机自增ID已无法满足需求。高并发、高可用的分布式ID生成方案成为构建可靠分布式系统的必要条件。R...

基于OpenWrt系统路由器的模式切换与网页设计

摘要:目前商用WiFi路由器已应用到多个领域,商家通过给用户提供一个稳定免费WiFi热点达到吸引客户、提升服务的目标。传统路由器自带的Luci界面提供了工厂模式的Web界面,用户可通过该界面配置路...

这篇文章教你看明白 nginx-ingress 控制器

主机nginx一般nginx做主机反向代理(网关)有以下配置...

如何用redis实现注册中心

一句话总结使用Redis实现注册中心:服务注册...

爱可可老师24小时热门分享(2020.5.10)

No1.看自己以前写的代码是种什么体验?No2.DooM-chip!国外网友SylvainLefebvre自制的无CPU、无操作码、无指令计数器...No3.我认为CS学位可以更好,如...

Apportable:拯救程序员,IOS一秒变安卓

摘要:还在为了跨平台使用cocos2d-x吗,拯救objc程序员的奇葩来了,ApportableSDK:FreeAndroidsupportforcocos2d-iPhone。App...

JAVA实现超买超卖方案汇总,那个最适合你,一篇文章彻底讲透

以下是几种Java实现超买超卖问题的核心解决方案及代码示例,针对高并发场景下的库存扣减问题:方案一:Redis原子操作+Lua脚本(推荐)//使用Redis+Lua保证原子性publicbo...

3月26日更新 快速施法自动施法可独立设置

2016年3月26日DOTA2有一个79.6MB的更新主要是针对自动施法和快速施法的调整本来内容不多不少朋友都有自动施法和快速施法的困扰英文更新日志一些视觉BUG修复就不翻译了主要翻译自动施...

Redis 是如何提供服务的

在刚刚接触Redis的时候,最想要知道的是一个’setnameJhon’命令到达Redis服务器的时候,它是如何返回’OK’的?里面命令处理的流程如何,具体细节怎么样?你一定有问过自己...

lua _G、_VERSION使用

到这里我们已经把lua基础库中的函数介绍完了,除了函数外基础库中还有两个常量,一个是_G,另一个是_VERSION。_G是基础库本身,指向自己,这个变量很有意思,可以无限引用自己,最后得到的还是自己,...

China&#39;s top diplomat to chair third China-Pacific Island countries foreign ministers&#39; meeting

BEIJING,May21(Xinhua)--ChineseForeignMinisterWangYi,alsoamemberofthePoliticalBureau...

移动工作交流工具Lua推出Insights数据分析产品

Lua是一个适用于各种职业人士的移动交流平台,它在今天推出了一项叫做Insights的全新功能。Insights是一个数据平台,客户可以在上面实时看到员工之间的交流情况,并分析这些情况对公司发展的影响...

Redis 7新武器:用Redis Stack实现向量搜索的极限压测

当传统关系型数据库还在为向量相似度搜索的性能挣扎时,Redis7的RedisStack...

Nginx/OpenResty详解,Nginx Lua编程,重定向与内部子请求

重定向与内部子请求Nginx的rewrite指令不仅可以在Nginx内部的server、location之间进行跳转,还可以进行外部链接的重定向。通过ngx_lua模块的Lua函数除了能实现Nginx...