在框架中声明struct的简单协议一致性

时间:2015-10-06 23:46:07

标签: swift struct linker protocols

是否可以声明结构体在框架中定义的结构符合我在应用程序中定义的协议?

比如说,我有一个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上添加了example project

更新:这似乎是一个已知问题。我已经提交了一个雷达,它被关闭为20648441的副本。

2 个答案:

答案 0 :(得分:0)

jdk/bin

修复它。似乎与存储的immutable属性与协议中计算的readonly属性存在某种冲突。

更新:没关系,我刚刚发现无限递归。似乎还有什么东西

答案 1 :(得分:0)

您发现有趣的错误。你和Scott H完成了所有的工作,但是想要提出一些解决方法:

  1. 将模型从class更改为func temperature() -> Float。不知道为什么会这样。

  2. 功能也有效(即foreach ($emp_code as $dat => $datas) { $out[] = ['id' => $datas['id'], 'name' => $datas->RelationName() ]; //more code... } )。

  3. 两者都不太理想。