[分享摘要]Swift 語言上手指北

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

值類型

閉包

//: 閉包簡化過程

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)秀的語言特性學習學習,已經很好

圖片來源

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容