Swifter Tips

1.currying + target-action *

2.將 protocol 的方法聲明為 mutating *
mutating 關(guān)鍵字修飾方法是為了能在該方法中修改 struct 或是 enum 的變量

3.Sequence - IteratorProtocol + Sequence ***

4.Tuple *

5.@autoclosure && ?? ** 簡潔

6.@escaping - *

7.optional chaining *

8.operator * 聲明操作符

9.func-params * - var + inout

10.literal *** - ExpressibleByArray/StringLiteral

11.subscript *** 簡潔

12.func nesting * 比較有用

13.nameSpacing *

14.typealias *

15.associatedtype **** - 類型占位符

16.variadic ***

17.init * 自動調(diào)用父類的 init 方法

18.designated & convenience & required ***
最大的好處,保證依賴于某個 designated 初始化方法的 convenience 一直可用

19.init? *

20.static & class *

21.多類型和容器 ** - [protocol] + case typeValue(type) 兩種方式封裝進容器

22.default param *

23.regex *

24.pattern-match ****
Swift 的 switch 就是使用了 ~= 操作符進行模式匹配,case 指定的模式作為左參,被 switch 的作為右參

  1. … & ..< * - “a”…”z” + \0…~

26.AnyClass & meta type & .self ***
在將這些元類型存入數(shù)組并且傳遞給別的方法來進行配置這一點上,元類型編程就很難被替代。.Type 表示的是某個類型的元類型

27.protocol & class method ’s Self *** — type(of:)

28.dynamic Type * — 不支持

29.屬性觀察 *****
— 屬性觀察的一個重要用處是作為 設(shè)置值的驗證
— 初始化方法對屬性的設(shè)定,以及在 willSet 和 didSet 中對屬性的再次設(shè)定都不會再次觸發(fā)屬性觀察的調(diào)用
— set & willSet & didSet 不能同時出現(xiàn),可以通過子類化實現(xiàn)
— didSet -> oldValue -> get

30.final ** 探討比較有意思
OC 中指定 attribute((objc_requires_super)) 這樣的屬性來讓編譯器在子類沒有調(diào)用父類方法時拋出警告

31.lazy *** — arr.lazy
— 對于那些不需要完全運行,可能提前退出的情況,使用 lazy 來進行性能優(yōu)化

32.reflection & mirror * 實用性不大
— _Reflectable & _reflect -> Mirror
— dump() -> mirror.description
— KVC

33.ImplicitlyUnwrappedOptional ** — 歷史原因
— 最大好處是,對于那些我們能確認的 API 來說,我們可直接進行屬性訪問和方法調(diào)用。不用 optional binding

34.多重 Optional *
— Optional == enum
— fr v -R xxx

35.Optional Map *** 自動解包
— 函子指的是可以被某個函數(shù)作用,并映射為另一組結(jié)果,而這組結(jié)果也是函子的值

36.protocol extension **
— 為 protocol 中定義的方法提供了默認實現(xiàn)
— type inference -> actual Type
<1> type method will be call, if didn’t have, -> extension default
— type inference -> protocol
<1> method in protocol, type method call. if didn’t have, -> extension default
<2> method not in protocol, -> extension default

37.where & pattern-match *

38.indirect & nested enum *

================================================================

1.selector ***
@objc - @objcMembers
使用 #selector 來從暴露給 OC 的代碼中獲取一個 selector

2.dynamic call instance method **
通過類型取出這個類型的某個實例方法的簽名,然后再通過傳遞實例來拿到實際需要調(diào)用的方法。
— Type.instanceMethod -> currying - f(object)(1)

3.singleton *
— 在初始化類變量的時候,Apple 將會把這個初始化包裝在一次 swift_once_block_invoke中,
保證它的唯一性。對于所有的全局變量,Apple 都會在底層使用類似 dispatch_once
的方式確保只以 lazy 的方式初始化一次。

4.條件編譯 **
— custom flags

5.編譯標記 *
— // MARK: - // TODO: // FIXME:

6.@UIApplicationMain *
main.swift

7.@objc & dynamic ***
將需要暴露給 OC 使用的任何地方(類、屬性、方法)的聲明前面加上 @objc 修飾符
如果需要和 OC 里的動態(tài)調(diào)用時相同的運行時特性的話,需要使用 dynamic - KVO

8.optional protocol & protocol extension **
— 使用 @objc 修飾的 protocol 就只能被 class 實現(xiàn)了
— 使用 protocol extension 提供默認實現(xiàn),達到 optional

9.memory management & weak & unowned *
— 如果能夠確定在訪問時不會被釋放的話,盡量用 owned,存在被釋放的可能,用 weak

lazy var printName: ()->() = {
    [weak self] in
    if let strongSelf = self {
        print(“name is \(strongSelf.name)”)
    }
}

10.@autoreleasepool *
— 在 app 中,整個主線程其實是跑在一個自動釋放池子里的,并且在每個主 Runloop 結(jié)束時進行 drain 操作。
這是一種必要的延遲釋放的方式,因為我們有時候需要確保在方法內(nèi)部初始化的生成的對象在被返回后別人還能使用,而不是立即被釋放掉。
— 更進一步,其實 @autoreleasepool 在編譯時會被展開為 NSAutoreleasePool,并附帶 drain 方法的調(diào)用。
— autoreleasepool {}
— 實例方法 和 類方法 創(chuàng)建對象不同

  1. value & reference Type ***
    — 寫時復制。
    — 將數(shù)組和字典設(shè)計為值類型最大的考慮是為了線程安全。當存儲的元素較少時,會非常高效
    — 使用數(shù)組和字典時最佳實踐:按照具體的數(shù)據(jù)規(guī)模和操作特點來決定是用值類型OR引用類型。
    在需要處理大量數(shù)據(jù)并且頻繁操作時 -> NSMutableArray & NSMutableDictionary。
    在容器條目小而容器本身數(shù)目多時 -> Array & Dictionary

  2. String & NSString ***

  3. UnsafePointer **
    — unsafeBitCast

  4. C 指針內(nèi)存管理 *

  5. COpaquePointer & C convention *
    — @convention

  6. GCD & asyncAfter ***
    — 將一個閉包封裝到 DispatchWorkItem 對象中,對其發(fā)送 cancel,來取消一個正在等待執(zhí)行的 block

  7. 獲取對象類型 **
    — type(of:)

  8. Introspection *
    — is,也可以用于 struct & enum 類型

  9. KeyPath & KVO *****
    — 像通過監(jiān)聽 model 的值來自動更新 UI 的綁定這樣的工作,基本都是 KVO 來完成的
    — Swift 4 之前 ~ dynamic + @objc + method
    — 4 之后 ~ \Foo.bar $$$
    — 子類化重寫屬性

  10. 局部 scope *
    — local(_ colsure: ()->())
    — do { … }

  11. 判等 *
    == - OC 是判斷兩個對象是否指向同一塊內(nèi)存地址。
    ===

22.哈希 *

23.類簇 *
簡單來說類簇就是使用一個統(tǒng)一的公共的類來訂制單一的接口,然后在表面之下對應若干個私有類進行實現(xiàn)的方式。
這么做最大的好處是避免公開很多子類造成混亂。
類簇在子類種類繁多,但是行為相對統(tǒng)一的時候?qū)τ诤喕涌诜浅S袔椭?br> Swift 類簇構(gòu)建,一種有效的方法是使用工廠方法。

24.調(diào)用 C 動態(tài)庫 *
MD5

25.輸出格式化 *

26.Options * - OptionSet

27.數(shù)組 enumerate * - .enumerated()

28.類型編碼 @encode * - .objCType
NSValue 設(shè)計的初衷就是被作為那些不能直接放入 NSArray 的值的容器來使用的。
存入 NSUserDefaults 可能有用。

29.C 代碼調(diào)用 和 @asmname *
Darwin

30.delegate * - : class

31.Associated Object *

32.Lock *
其實 @synchronized 在幕后做的事情是調(diào)用了 objc_sync 中的 objc_sync_enter & objc_sync_exit 方法,并且加入了一些異常判斷。

33.Toll-Free Bridging & Unmanaged<T> *
CF 現(xiàn)在也在 ARC 的范圍內(nèi)。
將這些返回 CF 對象的 API 導入 Swift 時,類型會對應為 Unmanaged<T>

================================================================

34.Swift 命令行工具 *
REPL Read-Eval-Print Loop
swift —help swiftc —help

35.隨機數(shù)生成 *

36.print & debugPrint * - CustomStringConvertible & CustomDebugStringConvertible
這種按照特性進行分離的設(shè)計理念對于功能的可擴展性的提升很有幫助。

37.錯誤和異常處理 *
異常只是一個同步方法專用的處理機制。對于異步 API 出錯時,保留了原來的 Error 的機制。

38.斷言 *

39.fatalError *
抽象類型或者抽象函數(shù)
在面對這種情況時,為了確保子類實現(xiàn)這些方法,而父類中的方法不被錯誤地調(diào)用,
我們就可以利用 fatalError 來在父類中強制拋出錯誤,以保證使用這些代碼的開發(fā)者
留意到他們必須在自己的子類中實現(xiàn)相關(guān)方法

相比起 模擬的抽象函數(shù) 的方式,面向協(xié)議編程能夠提供編譯時的保證,而不需要將檢查推遲到運行的時候。

40.代碼組織和 Framework **
.framework
lipo - 合并多個架構(gòu)

41.安全的資源組織方式 * SwiftGen

42.Playground 延時運行 *
import PlaygroundSupport
PlaygroundPage.current.needsIndefiniteExecution = true

43.Playground 與 項目協(xié)作 *

44.Playground 與 可視化開發(fā) *

45.數(shù)學和數(shù)字 *

46.JSON & Codable ***

47.NSNull *

48.文檔注釋 * alt + cmd + /

49.性能考慮 *

50.Log輸出 **
#file #line

51.溢出 32 64 *

52.宏定義 define *
使用合適作用范圍的 let 或者 get 屬性來替代原來的宏定義值
對于宏定義的方法,類似地在同樣作用域?qū)憺?Swift 方法

53.屬性訪問控制 *
open 標記的內(nèi)容才能在別的框架中被繼承或者重寫。

54.Swift 中的測試 * @testable

55.Core Data * @dynamic == @NSManaged

56.閉包歧義 *

57.泛型擴展 *

58.兼容性 *

59.列舉 enum 類型 *

60.尾遞歸 *

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容