簡體   English   中英

Swift函數中的泛型和協議一致性

[英]Generics and protocol conformance in Swift functions

我剛剛讀了布倫特·西蒙(Brent Simmon)關於他與Swift在一起的問題的文章 ,我認為我的答案是:通用協議一致性。

他遇到的問題是他有一個符合Equatable的協議Value 他還有另一個協議Smashable ,它需要函數valueBySmashingOtherValue 他有一個結構Bar ,實際上符合SmashableValue

在采用通用類型T的后續函數中,返回Bar Swift類型系統抱怨'Bar' is not convertible to 'T'

這是我認為可行的方法:

protocol Value: Equatable { }

protocol Smashable {
    func valueBySmashing​OtherValue​<T: Value, Smashable>(value: T) -> T
}

struct Bar: Smashable, Value {
    func valueBySmashing​OtherValue​<T: Value, Smashable>(value: T) -> T {
        return value;
    }
}

func ==(lhs: Bar, rhs: Bar) -> Bool {
    return false
}

struct Foo {
    func valueBySmashing​OtherValue​<T: Value, Smashable>(value: T) -> T {
        return Bar()
    }
}

使通用類型T符合ValueSmashable Bar實際上確實符合這些要求,因此您返回它時,類型系統應該沒問題。

但事實並非如此。 為什么?

盡管Bar確實符合ValueSmashable但它並不是唯一滿足這些條件的類型。 我可以創建一個新類型(使用最新的Swift語法):

struct NotBar: Smashable, Value {
    func valueBySmashing​OtherValue​<T:Value where T:Smashable>(value: T) -> T {
        return value;
    }
}
func ==(lhs: NotBar, rhs: NotBar) -> Bool {
    return true
}

如果我將NotBar的實例NotBarFoo.valueBySmashing​OtherValue ,那么我期望得到一個NotBar作為回報。 編譯器知道這一點,因此不允許您返回Bar

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM