如何在符合 Swift 协议的同时确定要实现哪些成员

Posted

技术标签:

【中文标题】如何在符合 Swift 协议的同时确定要实现哪些成员【英文标题】:How to determine which members to implement while conforming to a protocol in Swift 【发布时间】:2016-03-11 22:12:34 【问题描述】:

我通过玩 Swift 集合来学习 Swift。我想创建自己的序列,我知道我必须遵守SequenceType 协议。

我应该如何知道我必须实现协议的哪些成员? Apple 文档显示了很多 SequenceType 协议 (http://developer.apple.com/library/mac/documentation/Swift/Reference/Swift_SequenceType_Protocol/index.html) 的方法,例如。 dropLast(_:Int)generate()underestimateCount()

但事实证明我只需要提供generate() 方法并且编译器很高兴:

class MySequence : SequenceType 
    func generate() -> MyGenerator
        return MyGenerator(total: 6)
    

(如果不是各种博客文章,我不知道必须实施哪些SequenceType 成员)

在符合协议的同时,如何确定需要实现哪个成员?

我看到有些方法标有Default implementation 标签。但是,例如,dropLast(_: Int) -> Self.SubSequence 没有标记这样的标签,我不必实现它。

【问题讨论】:

我猜那些没有标记Default implementation的? @Stefan:我已经更新了这个问题。那么dropLast(_:Int) -> Self.SubSequence 方法呢? 更新了我的答案来解决这个问题。 【参考方案1】:

如果您查看 API 文档,您会注意到其中一些方法标有 Default implementation。这意味着该方法的实现已在扩展中定义,因此,除非您想修改默认行为,否则无需覆盖它们。这对于具有默认实现的generate() 不起作用的原因是,它的默认实现具有阻止它们处理所有情况的通用约束。

underestimateCount() 的方法和您提到的其他方法有一个没有约束的默认实现,这意味着您不需要覆盖它们。

对于dropLast(_: Int),它实际上确实有一个使用默认实现指定的版本,即dropLast(_: Int) -> AnySequence<Self.Generator.Element> Default Implementation。尽管它们在 API 文档中是分开的,但这种方法就足够了,因为它与协议中所需的方法具有相同的参数签名。

【讨论】:

那你怎么解释dropLast(_: Int) -> Self.SubSequence方法没有标Default implementation我不用实现呢? 它实际上确实有一个用Default implementation指定的版本,即dropLast(_: Int) -> AnySequence<Self.Generator.Element> Default Implementation。尽管它们在 API 文档中是分开的,但这种方法就足够了,因为它们具有相同的参数签名。 我现在明白了,谢谢。我是 Swift 新手,所以我认为它们是分开的,因为它们的返回类型和带有 Self.SubSequence 的那个需要它的 自己的 实现

以上是关于如何在符合 Swift 协议的同时确定要实现哪些成员的主要内容,如果未能解决你的问题,请参考以下文章

如何创建符合 Swift 和 Objective-C 之间共享协议的类方法?

如何让一个类快速符合协议?

NSManagedObject 不能符合 Swift 中的协议

在Swift中,如何声明键是函数的字典? (不符合协议'Hashable')

如何从 AppDelegate 访问符合 App 协议的 Swift 结构 [重复]

在 Swift 中对符合协议的对象和变量进行单元测试