ios - 扩展中的向下协议(protocol)一致性

标签 ios swift

假设我有两个非通用协议(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不是StringValuelinkedtype TypedStringValue:StringValue 来自 (2)

问题是如何在保持value类型的同时符合非泛型StringProvider

示例:

0.5.value.lowercased()

当然,StringValue 没有来自 Stringlowercased 方法,因此它无法编译。

我尝试过的:

首先是将非类型化属性添加到扩展 (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 }
}

它可以工作,没有编译器错误但是

  1. 在我们的示例中,小写没有自动补全功能。

  2. 使用扩展 (5),我需要为每个符合 StringProvider 的类以及该协议(protocol)具有的每个属性编写大量代码

有什么想法吗?

最佳答案

value 被定义为 StringValue 类型,因此这是您应该在 TypedStringProvider 扩展中指定的类型,以便完成协议(protocol)一致性:

extension TypedStringProvider {
    var value: StringValue {
        return typedValue
    }
}

关于ios - 扩展中的向下协议(protocol)一致性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55280615/

相关文章:

ios - UIScreen MainScreen Bounds 返回错误的大小

ios - iOS 中的日期选择器使用 Swift 编程

swift - 我怎样才能用当前时间计算一些位置的打开和关闭时间

ios - 最佳实践你只运行一次代码,并且只在你打开一个应用程序时运行。 swift 4,Xcode 8。

arrays - 如何使用 ExSwift Array.toDictionary?

swift - 尝试为 xCode 安装 Mapbox pod 会破坏现有的 pod

iphone - 在 uiwebview 中播放 youtube 视频。如何处理 "done"按钮?

iphone - 设置委托(delegate)时崩溃

ios - swift ,相机图像不返回

Swift ImagePicker 在 AutoLayout 约束上抛出 SIGNAL SIGABRT