如何在符合 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')