Array在哪里定义Element关联类型?

时间:2016-09-24 05:46:58

标签: swift generics associated-types

在Swift 2.3中,Array在哪里定义元素关联类型?

它必须定义它,因为它实现了GeneratorType,它具有Element相关的Type。 Dictionary和Set都定义了Element,但Array在哪里定义它?

Array有一个名为Element的泛型类型,泛型类型是否满足GeneratorType协议?

我在操场上试了这个,但对我来说并没有成功。

例如

protocol Animal{
    associatedtype Breed
}

struct Dog<Breed>: Animal{

}

1 个答案:

答案 0 :(得分:0)

在Swift 2中,Array符合CollectionType,它定义了要求:

/// Returns the element at the given `position`.
public subscript (position: Self.Index) -> Self.Generator.Element { get }

Array通过实现它来满足此要求:

public struct Array<Element> : CollectionType, MutableCollectionType, _DestructorSafeContainer {
    // ...

    // Swift can infer that Self.Index == Int & Self.Generator.Element == Element
    public subscript (index: Int) -> Element
    // ...
}

这允许Swift推断Array的通用占位符类型Element用于满足关联类型Self.Generator.Element,具体类型Int是用于满足关联类型Self.Index

这利用了以下事实:可以通过在符合该协议的给定类型中的协议要求的实现中使用的类型来隐式地满足相关类型。例如,在您的情况下:

protocol Animal {
    associatedtype Breed
    var breed : Breed { get }
}

// I've named the generic placeholder T to simply make clear that Swift is inferring
// T == Breed and therefore satisfying the associatedtype requirement.
// You can rename the generic placeholder back to 'Breed' – the compiler will still
// infer that it's satisfying the Breed associatedtype.
struct Dog<T> : Animal{
    let breed : T
}

enum BreedOfCat {/* ... */}

struct Cat : Animal {
    // same principle with non-generic types: BreedOfCat == Breed
    let breed : BreedOfCat
}

虽然当然,如果没有使用associatedtype的协议要求,则必须使用typealias明确满足:

protocol Animal {
    associatedtype Breed
}

struct Dog<T> : Animal{
    typealias Breed = T
}