我想強制關聯類型爲Self
,但編譯器沒有它。
這裏就是我想要去編譯:Swift Self作爲綁定在協議中的關聯類型
protocol Protocol {
// Error: Inheritance from non-protocol, non-class type 'Self'
associatedtype Type: Self
}
你可能會問,爲什麼不使用Self
代替相關類型的?僅僅因爲我不能:關聯類型是從父協議繼承的。在父協議中改變它是沒有意義的。
下面是類似我想要做一些事情:
protocol Factory {
associatedtype Type
func new() -> Type
}
protocol SelfFactory: Factory {
associatedtype Type: Self // Same Error
}
編輯:
馬特的答案几乎是什麼我要找的。它的行爲就像我在運行時所希望的那樣,但在編譯時沒有足夠的限制。
我想這是不可能的:
protocol Factory {
associatedtype MyType
static func new() -> MyType
}
protocol SelfFactory: Factory {
static func new() -> Self
}
final class Class: SelfFactory {
// Implement SelfFactory:
static func new() -> Class {
return Class()
}
// But make the Factory implementation diverge:
typealias MyType = Int
static func new() -> Int {
return 0
}
}
我想Class
的typealias
觸發重新聲明錯誤或相似。
錯誤消息是絕對正確的。用你的話來說明問題的根源:「關聯類型是從父協議繼承的」。不,它不是。協議不做「繼承」。你似乎無法像另一個協議那樣「覆蓋」一個協議。你要麼採用協議,要麼你不這樣做。 – matt
「我想在類中的typealias觸發重新聲明錯誤或類似的」你不能防止超載! 'f() - > Int'和'f() - > String'可以在Swift中共存。你在問語言是不同的語言。你不是編譯器。換句話說,採用協議並不妨礙我實施協議所不需要的其他方法! – matt
目前還不清楚你想要什麼,爲什麼。什麼會讓你滿意?也許你最好的選擇是有兩個_unrelated_協議,Factory和SelfFactory。我只採用它們。 _that_會讓你開心嗎? (但是當然,即使那樣你也不能阻止我採用他們兩個,如果我覺得這樣的話)。 – matt