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

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

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

一、变量与常量

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

相关推荐

MySQL进阶五之自动读写分离mysql-proxy

自动读写分离目前,大量现网用户的业务场景中存在读多写少、业务负载无法预测等情况,在有大量读请求的应用场景下,单个实例可能无法承受读取压力,甚至会对业务产生影响。为了实现读取能力的弹性扩展,分担数据库压...

Postgres vs MySQL_vs2022连接mysql数据库

...

3分钟短文 | Laravel SQL筛选两个日期之间的记录,怎么写?

引言今天说一个细分的需求,在模型中,或者使用laravel提供的EloquentORM功能,构造查询语句时,返回位于两个指定的日期之间的条目。应该怎么写?本文通过几个例子,为大家梳理一下。学习时...

一文由浅入深带你完全掌握MySQL的锁机制原理与应用

本文将跟大家聊聊InnoDB的锁。本文比较长,包括一条SQL是如何加锁的,一些加锁规则、如何分析和解决死锁问题等内容,建议耐心读完,肯定对大家有帮助的。为什么需要加锁呢?...

验证Mysql中联合索引的最左匹配原则

后端面试中一定是必问mysql的,在以往的面试中好几个面试官都反馈我Mysql基础不行,今天来着重复习一下自己的弱点知识。在Mysql调优中索引优化又是非常重要的方法,不管公司的大小只要后端项目中用到...

MySQL索引解析(联合索引/最左前缀/覆盖索引/索引下推)

目录1.索引基础...

你会看 MySQL 的执行计划(EXPLAIN)吗?

SQL执行太慢怎么办?我们通常会使用EXPLAIN命令来查看SQL的执行计划,然后根据执行计划找出问题所在并进行优化。用法简介...

MySQL 从入门到精通(四)之索引结构

索引概述索引(index),是帮助MySQL高效获取数据的数据结构(有序),在数据之外,数据库系统还维护者满足特定查询算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构...

mysql总结——面试中最常问到的知识点

mysql作为开源数据库中的榜一大哥,一直是面试官们考察的重中之重。今天,我们来总结一下mysql的知识点,供大家复习参照,看完这些知识点,再加上一些边角细节,基本上能够应付大多mysql相关面试了(...

mysql总结——面试中最常问到的知识点(2)

首先我们回顾一下上篇内容,主要复习了索引,事务,锁,以及SQL优化的工具。本篇文章接着写后面的内容。性能优化索引优化,SQL中索引的相关优化主要有以下几个方面:最好是全匹配。如果是联合索引的话,遵循最...

MySQL基础全知全解!超详细无废话!轻松上手~

本期内容提醒:全篇2300+字,篇幅较长,可搭配饭菜一同“食”用,全篇无废话(除了这句),干货满满,可收藏供后期反复观看。注:MySQL中语法不区分大小写,本篇中...

深入剖析 MySQL 中的锁机制原理_mysql 锁详解

在互联网软件开发领域,MySQL作为一款广泛应用的关系型数据库管理系统,其锁机制在保障数据一致性和实现并发控制方面扮演着举足轻重的角色。对于互联网软件开发人员而言,深入理解MySQL的锁机制原理...

Java 与 MySQL 性能优化:MySQL分区表设计与性能优化全解析

引言在数据库管理领域,随着数据量的不断增长,如何高效地管理和操作数据成为了一个关键问题。MySQL分区表作为一种有效的数据管理技术,能够将大型表划分为多个更小、更易管理的分区,从而提升数据库的性能和可...

MySQL基础篇:DQL数据查询操作_mysql 查

一、基础查询DQL基础查询语法SELECT字段列表FROM表名列表WHERE条件列表GROUPBY分组字段列表HAVING分组后条件列表ORDERBY排序字段列表LIMIT...

MySql:索引的基本使用_mysql索引的使用和原理

一、索引基础概念1.什么是索引?索引是数据库表的特殊数据结构(通常是B+树),用于...