Swift协议允许扩展,(根据我的理解)可以被视为根据其他协议方法和属性定义的默认实现。有时这些扩展会附加条件,但有时它们只是通配符。这使得在遵守协议的对象中需要实现实际的内容变得有点困难。例如,CollectionType
名义上需要实现以下(顶级)方法和属性:
public func generate() -> Self.Generator
public subscript (position: Self.Index) -> Self.Generator.Element { get }
public subscript (bounds: Range<Self.Index>) -> Self.SubSequence { get }
public func prefixUpTo(end: Self.Index) -> Self.SubSequence
public func suffixFrom(start: Self.Index) -> Self.SubSequence
public func prefixThrough(position: Self.Index) -> Self.SubSequence
public var isEmpty: Bool { get }
public var count: Self.Index.Distance { get }
public var first: Self.Generator.Element? { get }
但实际上,除了以下四个外,所有内容都已在通配符扩展中定义:
public func generate() -> Self.Generator
public subscript (position: Self.Index) -> Self.Generator.Element { get }
public subscript (bounds: Range<Self.Index>) -> Self.SubSequence { get }
public var count: Self.Index.Distance { get }
即便如此,在某些常见情况下也会提供subscript (bounds: Range<Self.Index>)
和generate()
。
有没有办法一目了然地告诉哪些协议方法和属性不由任何扩展名定义?
答案 0 :(得分:1)
如果您创建一个继承自协议P的类,则使用Xcode 8,任何未定义的函数或属性都将导致在类旁边显示红色错误项目符号。如果单击它,您可以选择定义存根函数。只会创建尚未在扩展中定义的功能。
就我所见(如果有更好的答案,我会很高兴看到它),这是你能做的最好的。