[英]Generics and protocol conformance in Swift functions
我剛剛讀了布倫特·西蒙(Brent Simmon)關於他與Swift在一起的問題的文章 ,我認為我的答案是:通用協議一致性。
他遇到的問題是他有一個符合Equatable
的協議Value
。 他還有另一個協議Smashable
,它需要函數valueBySmashingOtherValue
。 他有一個結構Bar
,實際上符合Smashable
和Value
。
在采用通用類型T
的后續函數中,返回Bar
。 Swift類型系統抱怨'Bar' is not convertible to 'T'
。
這是我認為可行的方法:
protocol Value: Equatable { }
protocol Smashable {
func valueBySmashingOtherValue<T: Value, Smashable>(value: T) -> T
}
struct Bar: Smashable, Value {
func valueBySmashingOtherValue<T: Value, Smashable>(value: T) -> T {
return value;
}
}
func ==(lhs: Bar, rhs: Bar) -> Bool {
return false
}
struct Foo {
func valueBySmashingOtherValue<T: Value, Smashable>(value: T) -> T {
return Bar()
}
}
使通用類型T
符合Value
和Smashable
。 Bar
實際上確實符合這些要求,因此您返回它時,類型系統應該沒問題。
但事實並非如此。 為什么?
盡管Bar
確實符合Value
和Smashable
但它並不是唯一滿足這些條件的類型。 我可以創建一個新類型(使用最新的Swift語法):
struct NotBar: Smashable, Value {
func valueBySmashingOtherValue<T:Value where T:Smashable>(value: T) -> T {
return value;
}
}
func ==(lhs: NotBar, rhs: NotBar) -> Bool {
return true
}
如果我將NotBar
的實例NotBar
給Foo.valueBySmashingOtherValue
,那么我期望得到一個NotBar
作為回報。 編譯器知道這一點,因此不允許您返回Bar
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.