【问题标题】:How to determine which members to implement while conforming to a protocol in Swift如何在符合 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 方法呢?
  • 更新了我的答案来解决这个问题。

标签: swift


【解决方案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 的那个需要它的 自己的 实现
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-09-28
  • 1970-01-01
  • 1970-01-01
  • 2023-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多