
Swift
程序員由于使用的編程語言不同,他的思考方法和編寫出來的代碼都會受到編程語言的很大影響。
——松本行弘
如果一門語言不能影響你的編程思想,那這門語言沒有學(xué)習(xí)的必要。
分享 Point
- 沒大段代碼,沒項目
- 涉及語言方面盡可能多,細(xì)節(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 等嚴(yán)格限定 Bool
- 不支持類型隱式轉(zhuǎn)換
可選類型
Null 引用的設(shè)計是十億美金錯誤
——Tony Hoare
- 函數(shù)接口設(shè)計寬進嚴(yán)出,同時又要保持語義清晰
- 引入 optional 也會帶來麻煩(解包等);而如果不引入,只是假裝這個問題不存在
代碼略
優(yōu)美
- 諸多現(xiàn)代語言特性可以讓呆萌結(jié)構(gòu)拆分更合理、語句更清晰
- 3.0 API 設(shè)計先行
- Guard 等細(xì)節(jié)
- 注釋支持 Markdown
代碼略
現(xiàn)代
面向?qū)ο髸r銀彈嗎?
- 不同繼承關(guān)系等類如何共用代碼
- copy & Paste
- 改變繼承關(guān)系
- 多繼承
- 依賴注入
- 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
總結(jié)
- Swift 取代 Objc 是必然,每名 iOSer 都該學(xué)習(xí),特別是 Swift4 發(fā)布后的現(xiàn)在
- Swift 語言本身設(shè)計非??季?,精簡而又靈活強大,很多的實現(xiàn)交給標(biāo)準(zhǔn)庫,給后續(xù)的發(fā)展留下很大空間
- 學(xué)習(xí)過程中注意區(qū)分哪些是語言特性,哪些事標(biāo)準(zhǔn)庫提供的封裝,對細(xì)節(jié)理解會更準(zhǔn)確
- Swift 對 Protocol Oriented Programming、Functional programming、ReactiveX 這些編程思想支持很好,這些學(xué)習(xí)門檻不低,不必急于求成,你依舊可以選擇先用你自己的方式(比 Objc 略略優(yōu)化)寫好代碼
- Swift 給開發(fā)提升自己的機會,它不能阻止開發(fā)寫出垃圾代碼(或許能一絲絲阻止)
- Swift 野心極大(取代 java),最終目標(biāo)很難實現(xiàn)。工程師先不用管這些,如果場景合適,寫寫 App,優(yōu)秀的語言特性學(xué)習(xí)學(xué)習(xí),已經(jīng)很好