是否可以声明在框架中定义的结构符合我的应用程序中定义的协议?
例如,我有一个API,它为一些在框架中建模的小部件声明了结构:
public struct VagueWidget {
public let temperature: Float
}
public struct SpecificWidget {
public let calibratedTemperature: Float
public let movingAverageTemperature: Float
}
public struct SuperSpecificWidget {
public let surfaceTemperature: Float
public let inferredCoreTemperature: Int?
}然后在我的应用程序中,我想通过一个协议来概括这些内容。
protocol Widget {
var temperature: Float { get }
}在我的应用程序中,我可以声明类似于API中的结构,并将它们声明为符合协议。
struct MockWidget {
let temperature: Float
}
extension MockWidget: Widget {}然后我可以声明框架中的结构的协议一致性。
extension SuperSpecificWidget: Widget {
var temperature: Float {
get {
return surfaceTemperature
}
}
}
extension SpecificWidget: Widget {
var temperature: Float {
get {
return calibratedTemperature
}
}
}
extension VagueWidget: Widget {}此代码编译,但不链接。框架中与应用程序中的VagueWidget等价的小小的一致性MockWidget导致缺少一个符号:
Undefined symbols for architecture x86_64:
"WidgetAPI.VagueWidget.temperature.getter : Swift.Float", referenced from:
protocol witness for WidgetApp.Widget.temperature.getter : Swift.Float in conformance WidgetAPI.VagueWidget : WidgetApp.Widget in WidgetApp in AppModel.o注释掉VagueWidget的简单协议一致性会产生编译和运行的代码,但显然缺少所需的协议一致性。我在github上添加了一个示例项目。
更新:,这似乎是一个已知的问题。我已经提交了一份雷达,它作为20648441的副本关闭了。
发布于 2015-10-07 00:43:33
extension WidgetAPI.VagueWidget: Widget {
var temperature: Float {
return self.temperature
}
}修好它。似乎与协议中存储的不可变属性与计算的只读属性之间存在某种冲突。
更新:我刚刚发现了无限递归。我还是觉得有点像,
发布于 2015-10-07 06:45:32
你发现的有趣的虫子。你和斯科特·H做了所有的工作,但想加入一些解决办法:
struct更改为class。不知道为什么会这样。func temperature() -> Float)。两者都不太理想。
https://stackoverflow.com/questions/32981542
复制相似问题