Swift:為String、Array、Dictionary新增isNotEmpty屬性

語言: CN / TW / HK


highlight: tomorrow-night-blue

小知識,大挑戰!本文正在參與“程式設計師必備小知識”創作活動。

前言

想要為Swift的String、Array、Dictionary這幾種常見型別,新增一個isNotEmpty屬性。

靈感來源於Dart中對於判斷陣列不為空有一個isNotEmpty屬性:

final array = [1, 2, 3, 4]; print(array.isNotEmpty);

Dart有,Swift也可以有啊。

直接明瞭版本

最直接明瞭的版本當然就是分別給String、Array、Dictionary寫分類,在分類中新增一個只讀計算屬性isNotEmpty即可。

String+Extension:

``` extension String {

var isNotEmpty: Bool { !isEmpty }

} ```

Array+Extension:

``` extension Array {

var isNotEmpty: Bool { !isEmpty }

} ```

Dictionary+Extension:

``` extension Dictionary {

var isNotEmpty: Bool { !isEmpty }

} ``` 上面3個分類,分別實現了String、Array、Dictionary三個常用型別的isNotEmpty。

但是!!!

你要了解到,有isEmpty屬性的型別遠不止以上三種類型,難道之後有需求對其他帶有isEmpty屬性的型別新增isNotEmpty屬性,我都要來寫一個分類?

這很明顯的是是沒有看透String、Array、Dictionary這些型別的背後,是由什麼在支撐著它們可以擁有isEmpty屬性。

更本質的版本:

滴水穿石非一日之功,冰凍三尺非一日之寒。

我想說的是入門的時候都會選擇直接了當的寫法,不過當在反反覆覆CV程式碼的時候,我們需要的是觀察,歸納,抽離,封裝。

image.png

上圖不知道大家注意到沒有:

  • Dictionary → Collection

  • Array → MutableCollection → Collection

Array與Dictionary都遵守了Collection協議,那麼這個isEmpyt屬性會不會就存在與Collection協議中呢?

帶著這個疑問,我們去看看Collection協議就知道了:

extension Collection {     /// A Boolean value indicating whether the collection is empty.     ///     /// When you need to check whether your collection is empty, use the     /// `isEmpty` property instead of checking that the `count` property is     /// equal to zero. For collections that don't conform to     /// `RandomAccessCollection`, accessing the `count` property iterates     /// through the elements of the collection.     ///     ///     let horseName = "Silver"     ///     if horseName.isEmpty {     ///         print("My horse has no name.")     ///     } else {     ///         print("Hi ho, \(horseName)!")     ///     }     ///     // Prints "Hi ho, Silver!")     ///     /// - Complexity: O(1)     @inlinable public var isEmpty: Bool { get } }

上面這段程式碼,摘自於Swift中的Collection原始碼,一直未動,如果你仔細看程式碼註釋,你會發現,舉例說明中是以String的isEmpty進行的,這也說明String型別也是遵守Collection協議的。

這麼一來就好辦了,我只需要在Collection協議的分類中,新增一個isNotEmpty屬性即可:

extension Collection {     /// 判斷集合非空     public var isNotEmpty: Bool {         return !isEmpty     } }

使用:

``` let array = [] print(array.isNotEmpty)

let dict = [:] print(dict.isNotEmpty)

let string = "" print(string.isNotEmpty) ```

以上程式碼均可以點出isNotEmpty,並列印true,效果符合預期。

參考文件:

Swift 裡集合型別協議的關係

總結

程式碼總是搬運不完的啦,但是讀懂程式碼,觀察程式碼我們都是可以的啦,只不過這其中需要我們多寫一些程式碼,甚至多走一點彎路。

我們下期見。