gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 05:54:38 28 4
gpt4 key购买 nike

假设我有两个非通用协议(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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com