在Apple的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实现了一个类型,即使这也在扩展中实现(在我希望的地方)。

最佳答案

看看this answer。冒号表示继承,等号表示赋值。
据我所知,这意味着:

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 Generics的this article的支持:
关联类型由使用typealias的协议声明
关键字。它通常由符合该协议的项设置,
尽管可以提供默认值。和类型参数一样,一个
生成泛型类型时,关联类型可用作标记
规则。
关键字typealias的使用可能会误导定义相关类型,并可能被the future中的associatedtype替换。

关于swift - 在Swift标准库中的协议(protocol)中使用typealias语法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34681998/

10-09 02:44