假设我有两个非通用协议(protocol)(1)
protocol StringValue {
var asString: String {get}
}
protocol StringProvider {
var value: StringValue {get}
}
我想要第二个的通用版本(2)
protocol TypedStringProvider: StringProvider { // inherits from StringProvider
associatedtype TypedStringValue: StringValue
var typedValue: TypedStringValue { get }
}
并且扩展具有非通用版本的默认实现,以便与 StringProvider
保持代码自由一致性(不起作用,请阅读下文)(3 )
extension TypedStringProvider {
var value: TypedStringValue { return typedValue }
}
现在我希望几个类都符合两者通用TypedStringProvider
和非通用StringProvider
协议(protocol) (4)
extension UIView: TypedStringProvider {
typealias TypedStringValue = String
var typedValue: String { return "Some String" }
}
extension Double: TypedStringProvider {
typealias TypedStringValue = String
var typedValue: String { return String(self) }
}
extension String: StringValue {
var asString: String { return self }
}
并出现编译器错误:类型“UIView”不符合协议(protocol)“StringProvider”
。
看起来扩展(3)并没有像我想要的那样工作,因为尽管存在此约束,但TypedStringValue
不是StringValue
linkedtype TypedStringValue:StringValue
来自 (2)
问题是如何在保持value
类型的同时符合非泛型StringProvider
示例:
0.5.value.lowercased()
当然,StringValue
没有来自 String
的 lowercased
方法,因此它无法编译。
我尝试过的:
首先是将非类型化属性添加到扩展 (3)
extension TypedStringProvider {
var value: TypedStringValue { return typedValue }
var value: StringValue { return typedValue }
}
由于“值”重新声明无效
错误而不起作用
第二是扩展我的类并在其中添加非类型化属性(5)
extension UIView {
var value: StringValue { return typedValue }
}
extension Double {
var value: StringValue { return typedValue }
}
它可以工作,没有编译器错误但是
在我们的示例中,
小写
没有自动补全功能。使用扩展 (5),我需要为每个符合
StringProvider
的类以及该协议(protocol)具有的每个属性编写大量代码
有什么想法吗?
最佳答案
value
被定义为 StringValue
类型,因此这是您应该在 TypedStringProvider
扩展中指定的类型,以便完成协议(protocol)一致性:
extension TypedStringProvider {
var value: StringValue {
return typedValue
}
}
关于ios - 扩展中的向下协议(protocol)一致性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55280615/