在Swift标准库的协议中使用typealias语法



在苹果的Swift编程指南中,描述了如何在协议中使用typealias关键字(来自Generics部分)

protocol Container {
  typealias ItemType
  mutating func append(item: ItemType)
  var count: Int { get }
  subscript(i: Int) -> ItemType { get }
}

然后实现:

struct IntStack: Container {
  typealias ItemType = Int // can sometimes be left out and inferred by the compiler
  mutating func append(item: Int) {
    self.push(item)
  }
// redacted
}

然而,在Swift标准库中发现了一个明显不同的用例,例如

public protocol ForwardIndexType : _Incrementable {
typealias Distance : _SignedIntegerType = Int
// redacted
}

public protocol CollectionType : Indexable, SequenceType {
typealias Generator : GeneratorType = IndexingGenerator<Self>
public func generate() -> Self.Generator
// redacted
}

连同:

extension CollectionType where Generator == IndexingGenerator<Self> {
  public func generate() -> IndexingGenerator<Self>
}

这个语法代表什么?类型别名似乎同时声明、限制(例如为GeneratorType)和分配?这意味着什么?为什么会这样?我希望只在实现客户端代码时看到赋值(=)。

我对typealias的理解是,它代表一种类型,由实现代码"填充"(根据泛型),但在这里,它似乎在声明中为typealias实现了一个类型,尽管这也在扩展中完成(我希望它在哪里)。

看看这个答案。使用冒号表示继承,使用等号表示赋值。

根据我的理解,这意味着:

typealias X // defines associated type X for subclasses to override
typealias X: Y // defines associated type X and requires that it conform to Y
typealias X = Z // defines associated type X with a default of type Z
typealias X: Y = Z // defines associated type X with a default of type Z and requires that any overrides conform to Y

我的解释似乎得到了这篇关于Swift泛型的文章的支持:

关联类型由使用typealias的协议声明关键字。它通常由符合该协议的项目设置,尽管您可以提供默认值。与类型参数一样在生成泛型类型时,关联类型可以用作标记规则。

关键字typealias的使用可能会误导定义相关类型,并且将来可能会被associatedtype取代。

相关内容

  • 没有找到相关文章

最新更新