我有一個協議有一個函數,可以返回一個字符串或[String:String]。這是我的聲明:
沒問題。我們寫下來。
enum StringOrDictionary {
case string(String)
case dictionary([String: String])
}
protocol Test {
func returnSomething() -> StringOrDictionary
}
然後我想爲returnSomething的默認實現,所以我做了一個協議擴展:
聽起來不錯。我假設readValueFromPLISTthatCanReturnAStringOrDictionary()
實際上返回Any
,因爲這是propertyList(from:)
返回的內容。
extension Test {
func returnSomething() -> StringOrDictionary {
let value = readValueFromPLISTthatCanReturnAStringOrDictionary()
switch value {
case let string as String: return .string(string)
case let dictionary as [String: String]: return .dictionary(dictionary)
default: fatalError() // Or perhaps you'd like to do something else
}
}
}
這很可能是不錯的命名類型的東西比StringOrDictionary
比更有意義,但另一方面,它應該是相當簡單的。只需製作一種表達你所說的話的類型即可。你想要一個類型意味着「或」,這是一個枚舉。 (如果你想有一個類型的,意思是「AND」,這是一個結構BTW)
關於你的答案,這是不合法的:
class RandomClass: Test where Test.T == String {
func getValue() {
let bah = doSomething() // I don't need here to specify bah's type.
}
}
的方式來定義你的T
是落實所需的方法。
class RandomClass: Test {
func returnSomething() -> String {
return ""
}
}
如果您想分享一些通用代碼,那麼您可以將它附加爲擴展名而不是默認實現。你可以寫一個returnString()
方法並從RandomClass.returnSomething()中調用它。這在某些情況下非常有用,但我絕對不會在這種情況下使用它。你不是指「返回任何可能的類型(T)」。你的意思是「返回兩種可能類型之一」,這是一個枚舉,而不是泛型。
更新:顯然他們已經添加了一個他們已經提到的新功能,但我認爲還沒有。現在,您可以實現RandomClass
這樣:
class RandomClass: Test {
typealias T = String
}
(這是一個非常不錯的新功能,即使它不是對於這個問題一個很好的答案。)
你的問題是很抽象的,我不完全理解它。你能否詳細說明一下? – Alexander
如果您不覆蓋它,總是使用默認實現,所以我不確定問題是什麼 – Alexander
我想使用默認實現,但我無法使用它,因爲TestString和TestDictionary不會告訴測試協議,泛型類型是T. – Godfather