首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >框架中对象协议一致性的快速扩展导致无限循环

框架中对象协议一致性的快速扩展导致无限循环
EN

Stack Overflow用户
提问于 2015-08-07 15:11:24
回答 2查看 1.2K关注 0票数 0

问题是:模型对象是在框架中定义的,协议是在app目标中定义的。app目标具有框架知识,反之亦然,因此协议一致性不能出现在模型对象的声明中。

然而,模型对象已经拥有实现协议所需的大部分字段(主要是var {get}声明),而且--显然--这些字段的名称是相同的。在实际模型中约有20个属性。

不出所料,以下模式会产生一个无限循环:

代码语言:javascript
复制
//Framework Target:  

public struct Book {
    public let numberOfPages : Int
}

代码语言:javascript
复制
//App target:

public protocol BookViewDataSource {
    var numberOfPages : Int { get }
}

extension Book : BookViewDataSource {
    public var numberOfPages : Int { return self.numberOfPages } 
}

但另一个选择是什么?被拒绝/失败的想法:

  1. 视图直接采用模型。一种常见的方法,总是不好的,因为它将视图和模型紧密地结合在一起。使用基于协议的接口可以方便地在设计时和运行时与模拟对象交换。
  2. 不同的名字。给出协议属性和struct属性不同的名称是可行的,但会把命名弄得乱七八糟,而且很愚蠢,因为模型对象几乎完全符合视图所需的数据。我们将其保存在一个框架中(遵循WWDC 14“构建现代框架”的建议),以便在共享扩展中更好地重用。
  3. 模型了解协议。现在,我们采用为视图编写的协议来定义它们需要的数据,并将它们移动到框架中。可笑,但却完全消除了扩展的需要。
  4. 协议扩展。如果我们可以定义引用self的协议的默认实现,那么满足该协议的对象将只访问它们的getter?但是,虽然没有内联错误,编译器(特别是链接器)不允许使用它,引用了“协议见证”,坚持认为Book仍然没有实现协议(我们保留扩展来计算它没有的属性)。

这整件事似乎是一个常见的场景,只是为了说明一个类型已经实现了协议。我们是否错过了任何简单的方法来做到这一点,或者我们是否有理由/如何选择上述方法?谢谢。

EN

回答 2

Stack Overflow用户

发布于 2015-08-07 15:20:22

对于我来说,这是可行的,没有编译器仍然能够找到Book的一致性的实现声明:

代码语言:javascript
复制
public struct Book {
    public let numberOfPages : Int
}

public protocol BookViewDataSource {
    var numberOfPages : Int { get }
}

extension Book : BookViewDataSource {
}

let x = Book(numberOfPages: 3)
print(x)

上面的工作在SwiftStub上,我现在还不能到达Mac!

票数 1
EN

Stack Overflow用户

发布于 2015-08-08 22:55:04

如果您忽略了扩展中的实现,编译器应该会帮您解决这个问题。因此,这应该被认为是一个错误(链接器错误)。

你更新到Xcode 7 beta 5了吗?因为这个版本解决了其中的一些问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31881123

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档