Swift 開發中不可不知的 Tips 集合

收藏待读

Swift 開發中不可不知的 Tips 集合

Swift 開發中不可不知的 Tips 集合

作者|Dariel

  1. 如何在 Swift  中實現多繼承?

  2. 怎麼做到自動檢查 Controller  被銷毀?

  3. Swift  中的  KVO  可以不基於  Runtime  嗎?

  4. 如何優雅的實現 TableView   刷新動效?

  5. 不需管理  key  是否還可以使用  UserDefaults

1. 如何在 Swift 中實現多繼承?

1.1 實現過程

Swift 本身並不支持多繼承,但我們可以根據已有的 API 去實現。

Swift 中的類可以遵守多個協議,但是只可以繼承一個類,而值類型(結構體和枚舉)只能遵守單個或多個協議,不能做繼承操作。

多繼承的實現: 協議的方法可以在該協議的 extension 中實現

Swift 開發中不可不知的 Tips 集合

無論是結構體還是類還是枚舉都可以遵守多個協議,所以多繼承就這麼做到了。

1.2 通過多繼承為 UIView  擴展方法

Swift 開發中不可不知的 Tips 集合

Swift 開發中不可不知的 Tips 集合

Swift 開發中不可不知的 Tips 集合

2. 怎麼做到自動檢查 Controller  被銷毀?

檢查內存泄漏除了使用 Instruments ,還有查看控制器  pop  或  dismiss  後是否被銷毀,後者相對來說更方便一點。但老是盯着析構函數  deinit  看日誌輸出是否有點麻煩呢?

UIViewController  有提供兩個不知名的屬性:  

  1. isBeingDismissed : 當modal出來的控制器被  dismiss  後的值為  true

  2. isMovingFromParent : 在控制器的堆棧中,如果當前控制器從父控制器中移除,值會變成  true

如果這兩個屬性都為 true ,表明控制器馬上要被銷毀了,但這是由 ARC 去做內存管理,我們並不知道多久之後被銷毀,簡單起見就設個 2 秒吧。

Swift 開發中不可不知的 Tips 集合

我們把這個方法添加到 viewDidDisappear(_:) 

Swift 開發中不可不知的 Tips 集合

如果發生循環引用,控制就不會被銷毀,會觸發 assert  報錯。

3.  Swift 中的  KVO  可以不基於  Runtime  嗎?

Swift 並沒有在語言層級上支持 KVO,如果要使用必須導入 Foundation  框架,被觀察對象必須繼承自  NSObject ,這種實現方式顯然不夠優雅。  

KVO 本質上還是通過拿到屬性的 set 方法去搞事情,基於這樣的原理我們可以自己去實現。

3.1 實現

話不多說,直接貼代碼,新建一個 Observable  文件

Swift 開發中不可不知的 Tips 集合

Swift 開發中不可不知的 Tips 集合

Swift 開發中不可不知的 Tips 集合

使用起來和 KVO 差不多。

3.2 使用

需要監聽的類

public class User {
    // 監聽的屬性需要是 Observable 類型
    public let name: Observable    
    public init(name: String) {
        self.name = Observable(name)
    }
}

使用

// 創建對象
let user = User(name: "Made")
// 設置監聽
user.name.addObserver(self, options: [.new]) { name, change in
    print("name:(name), change:(change)")
}
// 修改對象的屬性
user.name.value = "Amel"  
// 這時就可以被監聽到

// 移除監聽
user.name.removeObserver(self)

注意: 在使用過程中,如果改變 value,addObserver方法不調用,很有可能是 Observer 對象已經被釋放掉了。

4. 如何優雅的實現  TableView  刷新動效

1. 簡單的實現

我們都知道 TableView 的刷新動效是設置在 tableView(_:,willDisplay:,forRowAt:) 這個方法中的。

Swift 開發中不可不知的 Tips 集合

這樣一個簡單的淡入效果就 OK 了,但這樣做顯然不夠優雅,我們如果要在多個 TableView 使用這個效果該怎樣封裝呢?

2. 使用工廠設計模式進行封裝

2.1 creator(創建者): Animator ,用來傳入參數,和設置動畫 Swift 開發中不可不知的 Tips 集合

2.2  product(產品): AnimationFactory ,用來設置不同的動畫類型

Swift 開發中不可不知的 Tips 集合

將所有的動畫設置封裝在 Animation 的閉包中。

最後我們就可以在 tableView(_:,willDisplay:,forRowAt:) 這個方法中使用如下代碼,就實現最終效果

Swift 開發中不可不知的 Tips 集合

Swift 開發中不可不知的 Tips 集合

5. 不需管理  key 是否還可以使用  UserDefaults 

用來做簡單數據存儲的 Preference  在我們的日常開發中使用的還是比較多的,但使用起來總感覺不那麼方便。比如說需要去手動管理  key ,之前是這樣做的。

Swift 開發中不可不知的 Tips 集合

我們可以通過使用 #function  避免手動管理  key ,在存儲和讀取數據時調動的  set  和  get  方法也可以交給目標屬性默認的  set  和  get  方法去做,。

Swift 開發中不可不知的 Tips 集合

Swift 開發中不可不知的 Tips 集合

在測試環節經常需要在測試服和正式服來回切換,為了避免老是打包,我們可以利用 UserDefaults  去更改服務器地址,在適當的位置(可以是個測試頁面)加個  UISwitch ,然後設置  serverUrl  的值。

UserDefaults  有性能問題嗎?

UserDefaults  是帶緩存的。它會把訪問到的  key  緩存到內存中,下次再訪問時,如果內存中命中就直接訪問,如果未命中再從文件中載入。它還會時不時調用同步方法來保證內存與文件中的數據的一致性,有時在寫入一個值後也最好調用下這個方法來保證數據真正寫入文件。

更多

限於篇幅原因這裡分享部分Tips,更多內容如 使用面向協議實現 app 的主題功能線程安全: 互斥鎖和自旋鎖給UIViewController添加靜態Cell  等點擊  閱讀原文   查看,本篇來自讀者 Dariel 投稿,這裡也歡迎更多的讀者朋友推薦分享。

推薦閱讀:

  1. https://github.com/DarielChen/SwiftTips

  2. 2019 讓自己變的更加優秀(文末新年福利)

  3. 手摸手帶你玩轉Xcode Extensions

原文 :

相關閱讀

免责声明:本文内容来源于mp.weixin.qq.com,已注明原文出处和链接,文章观点不代表立场,如若侵犯到您的权益,或涉不实谣言,敬请向我们提出检举。