iOS 开发最早是 Object-C 使用多,语言语法比较各色,比较难于上手,Object-C 需要手动释放内存,使用起来门槛较高。Object-C 与 swift 的选择就像《黑客帝国》中选择蓝药丸或者红药丸,两者天差地别,会引发继续移动应用研发还是果断弃坑,选择很重要。后来苹果为了降低开发者使用门槛,开了swift 语言,swift 语言相比 Object-C 语言上手难度降低很多,语句表达比较简短,内存大部分场景自动进行释放,这对于扩大语言的受众有很大帮助。swift 语言语法层面增加了很多的细节,Optional 语句,在 swift 语言中使用极其广泛,需要对这种语法有一定的理解,不然很多 apple 官方文档看不明白。以下是常见的使用方式。var optionalString: String? = "Hello"var optionalInt: Int? = nil // 值为空
let value: String? = "Hello"print(value!) // 危险!如果 value 是 nil 会崩溃
if let actualValue = optionalString { print("值存在: \(actualValue)")} else { print("值为 nil")}// 多个可选绑定if let name = person.name, let age = person.age { print("\(name) 的年龄是 \(age)")}
func processUser(name: String?) { guard let userName = name else { print("用户名为空") return } // userName 在这里已解包并可用 print("处理用户: \(userName)")}
使用过 Java8 语言的同学,可以拿 JDK8 中的 Optional 可选类型进行对比,通过对比理解这个可选概念,再结合实际使用,就容易理解这个语法了。swift 中使用元组也较多,这个语法在其他语言,相对较少,元组与结构体类似但又存在这差别。// 未命名元组let http404Error = (404, "Not Found")print(http404Error.0) // 404print(http404Error.1) // "Not Found"// 命名元组(推荐)let person = (name: "张三", age: 25, city: "北京")print(person.name) // "张三"print(person.age) // 25print(person.city) // "北京"
// 返回命名元组func calculateStatistics(scores: [Int]) -> (min: Int, max: Int, sum: Int) { var min = scores[0] var max = scores[0] var sum = 0 for score in scores { if score < min { min = score } if score > max { max = score } sum += score } return (min, max, sum)}let stats = calculateStatistics(scores: [85, 90, 78, 92, 88])print("最低分: \(stats.min)")print("最高分: \(stats.max)")print("总分: \(stats.sum)")
// 元组支持比较(最多6个元素)let tuple1 = (1, "apple")let tuple2 = (1, "apple")let tuple3 = (2, "banana")print(tuple1 == tuple2) // trueprint(tuple1 < tuple3) // true - 按顺序比较每个元素// 比较规则:先比较第一个元素,相等再比较第二个let points = [(1, 2), (3, 1), (2, 3)]let sorted = points.sorted(by: <)print(sorted) // [(1, 2), (2, 3), (3, 1)]
swift 语言闭包也是一个特色,且在语言中使用常见的语法,前边有文章进行讲述,现介绍使用相对比较难理解的两个场景。// @autoclosure - 延迟求值func assert(_ condition: @autoclosure () -> Bool, _ message: @autoclosure () -> String) { if !condition() { fatalError(message()) }}let x = 10assert(x > 0, "x 必须大于 0") // 条件只在调试时求值// @escaping - 逃逸闭包func performAsyncTask(completion: @escaping (Result<Data, Error>) -> Void) { DispatchQueue.global().async { // 异步操作 completion(.success(Data())) }}
Optional 的理解:
元组使用场景:
闭包掌握要点:
理解捕获列表(避免循环引用)
区分逃逸和非逃逸闭包
熟练使用尾随闭包语法
Swift 的这些特性确实在提高开发效率的同时,相比于 Object-C 降低了学习曲线。
用小马哥的话说:「我不是想证明Swift有多么了不起,我只是要告诉所有人,开发者失去的体验、效率和快乐,我一定要亲手拿回来!」