2019年10月14日 星期一

[iOS] Swift some 與 Opaque Result Types

Swift5.1之後出現了SwiftUI,學習時發現了一個新的關鍵字some


因此稍微研究了一下有關some的使用方式。

簡單的說當你的Protocol有associatedtype或Self時,Swift無法得知你的具體類型為何。

我們先來看一般狀況的Protocol,我們有個Animal的Protocol,並且有兩個struct去實作它。

此時我們寫一個Func,可以取得一個Animal

一切都很美好,但是如果我們想在Protocol加入associatedtype,像是以下的程式碼。

接著你會發現原本的取得Animal方法被發出警告訊息

原本的做法,你必須改成以下的寫法


使用時也必須指定資料型態


整體來說並不是太方便,因此多了some關鍵字,我們只需要將原本的程式碼改成以下的樣子

如此一來就可以很方便的使用,使用時也不必指定資料型態。


但是要注意的是,若是你的Func有多種類回傳值,分別是不同的實作該Protocol是不行的。


簡單的說some會依照你的回傳值來判斷是哪個類型實作了該Protocol,你不用特別指定哪個類型,而是依照你回傳的值來決定。

舉一個比較常見的例子,Equatable這個Protocol,它的定義如下。


你必須實作==這個Func才算符合Equatable這個Protocol,我們都知道Int有實作該Protocol,因此我們寫一個Func,來隨機產生一個Int,可是我們希望回傳的資料型態是Equatable。



經過上面的例子我們知道是不行的,因為Equatable裡面有使用到Self,因此必須加上some關鍵字。

我們加上some之後,我們繼續增加另一個產生字串的Func,一樣回傳Equatable。

接著我們呼叫這兩個方法,將它們的值取出。


會發現,兩個都是Equatable資料型態,那我們來使用==方法看看。


事實上是不行的,因為雖然表面上都是Equatable,實際上一個是Int,一個是String,雖然我們看不出來,但是Xcode很聰明的看出差異了。

但是如果來源都是同一個Func所Return的值,Xcode會視為相同的。


如果你有兩個Func所Return的值是相同的,Xcode也會認為不同哦,它只認Func,不認回傳值。


沒有留言:

張貼留言