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,不認回傳值。
沒有留言:
張貼留言