我有一个协议有一个函数,可以返回一个字符串或[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