2015-10-06 38 views
3

是否可以声明该结构在框架中定义的结构可以简单地符合在我的应用程序中定义的协议?声明框架中结构的普通协议一致性

说,例如,我有一个声明为一个框架仿照了几个小工具结构的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 {} 

此代码编译但未链接。中相应的框架,它是等效于在丢失符号中的应用效果的MockWidget平凡符合VagueWidget

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的副本关闭。

回答

0
extension WidgetAPI.VagueWidget: Widget { 
    var temperature: Float { 
     return self.temperature 
    } 
} 

修复它。似乎与存储的不可变属性与协议中计算的只读属性存在某种冲突。

更新:没关系,我刚刚发现了无限递归。仍然看起来像那里

+0

呵呵,你看起来是正确的。尽管我看起来像无限递归,但我可以发誓我试过了。谢谢! – blackp

+0

@blackp看到更新,我错了。这只是无限递归。仍试图通过这一工作。我在另一个项目中复制了它。 –

+0

啊好吧。看起来像无限递归。上面评论它的出现正确的地方是我运行API目标的单元测试,而不是应用程序。 :) – blackp

0

你发现有趣的bug。你和Scott^h做了所有的工作,但想一些变通办法来帮腔:

  1. 改变你的模型从structclass。不知道为什么这个工程。

  2. 功能也起作用(即func temperature() -> Float)。

两者都不太理想。