Swift
程序員由于使用的編程語言不同,他的思考方法和編寫出來的代碼都會受到編程語言的很大影響。
——松本行弘
如果一門語言不能影響你的編程思想,那這門語言沒有學習的必要。
分享 Point
- 沒大段代碼,沒項目
- 涉及語言方面盡可能多,細節(jié)一帶而過
- 本人 Swift 新手一枚,分享旨在勾引,盡可能介紹我理解的 swift 語言魅力為要
Swift 介紹
介紹
Swift is a general-purpose programming language built using a modern approach to safety, performance, and software design patterns.
Safe, Fast, Expressive.
——Swift.org - About Swift
一門安全、優(yōu)美、現(xiàn)代的語言。
代碼略
安全
為什么說 Swift 是強類型語言(不是玩具語言)
- if, while 等嚴格限定 Bool
- 不支持類型隱式轉換
可選類型
Null 引用的設計是十億美金錯誤
——Tony Hoare
- 函數(shù)接口設計寬進嚴出,同時又要保持語義清晰
- 引入 optional 也會帶來麻煩(解包等);而如果不引入,只是假裝這個問題不存在
代碼略
優(yōu)美
- 諸多現(xiàn)代語言特性可以讓呆萌結構拆分更合理、語句更清晰
- 3.0 API 設計先行
- Guard 等細節(jié)
- 注釋支持 Markdown
代碼略
現(xiàn)代
面向對象時銀彈嗎?
- 不同繼承關系等類如何共用代碼
- copy & Paste
- 改變繼承關系
- 多繼承
- 依賴注入
- Trait
例子:OOP vs POP
值類型
閉包
- Objective-C sort 閉包寫法
- Java sort 閉包寫法
- Swift 賦予閉包函數(shù)本該有的樣子 Objc 與之一戰(zhàn) ??
//: 閉包簡化過程
let arr = [1, 3, 7, 9, 5]
// 完整閉包表達式
let rs0 = arr.sorted(by: { (item0: Int, item1: Int) -> Bool in
return item0 < item1
})
// 類型推斷
let rs1 = arr.sorted(by: { item0, item1 in
return item0 < item1
})
// 單行隱式返回
let rs2 = arr.sorted(by: { item0, item1 in item0 < item1 })
rs2
// 參數(shù)名稱縮寫
let rs3 = arr.sorted(by: { $0 < $1 })
rs3
// 尾隨閉包簡化方向
let rs4 = arr.sorted() { $0 < $1 }
rs4
// 唯一參數(shù),括號可省略
let rs5 = arr.sorted { $0 < $1 }
rs5
// 運算符方法簡化方向: Swift 可以自動推斷出你想使用小于號的 Int 比較函數(shù)實現(xiàn)
let rs6 = arr.sorted(by: <)
閉包帶來的寫法簡化
范型
自定義(重載)運算符
一個古老的故事:p0 和 p1 相愛??,于是就有了 baby……
class Person {
var name: String
var babies = [Person]()
init(name aName: String) {
name = aName
}
}
infix operator ??: AdditionPrecedence
extension Person {
static func ?? (left: Person, right: Person) -> Void {
let baby = Person(name: left.name + right.name)
left.babies.append(baby)
right.babies.append(baby)
}
}
p0 ?? p1
p0.babies
p1.babies
總結
- Swift 取代 Objc 是必然,每名 iOSer 都該學習,特別是 Swift4 發(fā)布后的現(xiàn)在
- Swift 語言本身設計非常考究,精簡而又靈活強大,很多的實現(xiàn)交給標準庫,給后續(xù)的發(fā)展留下很大空間
- 學習過程中注意區(qū)分哪些是語言特性,哪些事標準庫提供的封裝,對細節(jié)理解會更準確
- Swift 對 Protocol Oriented Programming、Functional programming、ReactiveX 這些編程思想支持很好,這些學習門檻不低,不必急于求成,你依舊可以選擇先用你自己的方式(比 Objc 略略優(yōu)化)寫好代碼
- Swift 給開發(fā)提升自己的機會,它不能阻止開發(fā)寫出垃圾代碼(或許能一絲絲阻止)
- Swift 野心極大(取代 java),最終目標很難實現(xiàn)。工程師先不用管這些,如果場景合適,寫寫 App,優(yōu)秀的語言特性學習學習,已經很好