注意下面的編譯:
protocol Foo {
associatedtype A
}
struct Container<F: Foo> {
func f(a: F.A) { }
}
然而,在的情況下:
struct Container<F: Foo> {
func f<A : F.A>(a: A) { } // error: inheritance from non-protocol, non-class type
}
...類型F.A
完全不受約束,因此它很可能是,比如說,一個Int
,你不能從:
語法繼承或符合。
如果你真的需要比(a: F.A)
一個更通用的解決方案,然後沿着這些路線的東西可能會做到這一點:
protocol Bar { }
protocol Foo {
associatedtype A : Bar
}
struct Container<F: Foo> {
func f<A : Bar>(a: A) { }
}
現在,您可以表達對使用Bar
協議a
參數的任何預期。
更妙的是,你可能能夠實現方法的Foo
擴展:
protocol Foo {
associatedtype A
func f(_: A) // if you want this to be a requirement
}
extension Foo /* where A is constrained so you can do something with it */ {
func f(a: A) { }
}
在我的使用情況下,'Container'方法'F'必須被約束的Foo'子類類型。也就是說,它必須是「Foo.A」類型或子類。當你說F.A沒有約束是問題時,我不確定你是對的。畢竟,如果我們使'associatedtype A:Bar','func f (a:A){}'仍然失敗。 – Stephen
我從來沒有建議'associatedtype A:Bar','func f (a:A){}' - 這肯定會失敗。請仔細看一下'Bar'代碼片段......還要注意,如果這是您需要的,您可以用一個特定的類來替換'Bar'。至於「不確定」,你有沒有對我的解釋有任何特別的反對意見(例如'F.A'是'Int'的情況下)? – milos
我注意到了我們的片段之間的區別。我在迴應你引用'F.A型完全無約束'的地方作爲錯誤的原因。即使有限制,結果也是一樣的。爲什麼不能將關聯的類型用作約束? – Stephen