swift – 什么是“元素”类型?

阅读Swift编程语言书我看过类型为Element的引用数,用于定义集合项的类型.但是,我找不到任何关于它的文档,是类,协议吗?它有什么样的功能/方法/属性?

struct Stack<Element>: Container {
    // original Stack<Element> implementation
    var items = [Element]()
    mutating func push(_ item: Element) {
        items.append(item)
    }
    ...
最佳答案
如果我们尝试跟踪我们在处理集合时如何获取Element的想法,我们会注意到它与Iterator协议有关.让我们说清楚一点:

Swift Collection types(Array,DictionarySet)都符合Collection protocol.因此,当谈到Collection协议时,我们可以看到它的根是Sequence protocol

A type that provides sequential, iterated access to its elements.

Sequence有一个Element和Iterator相关的类型,声明为:

associatedtype Element

associatedtype Iterator : IteratorProtocol where Iterator.Element == Element

您可以在序列source code上查看它.

如图所示,Iterator还有一个Element associated type,它与序列元素进行比较,这意味着什么?

IteratorProtocol是做实际工作的人:

The IteratorProtocol protocol is tightly linked with the Sequence
protocol. Sequences provide access to their elements by creating an
iterator, which keeps track of its iteration process and returns one
element at a time as it advances through the sequence.

因此,Element将是序列返回元素的类型.

编码:

为了使其易于理解,您可以实现这样的代码来模拟案例:

protocol MyProtocol {
    associatedtype MyElement
}

extension MyProtocol where MyElement == String {
    func sayHello() {
        print("Hello")
    }
}

struct MyStruct: MyProtocol {
    typealias MyElement = String
}

MyStruct().sayHello()

注意 – 如上所示 – 实现MyProtocol的扩展使得MyElement关联类型对于where子句是明智的.

因此,sayHello()方法仅适用于为MyElement分配String的MyProtocol类型(在我们的例子中为MyStruct),这意味着如果MyStruct已经实现为:

struct MyStruct: MyProtocol {
    typealias MyElement = Int
}

你将无法:

MyStruct().sayHello()

您应该看到编译时错误:

‘MyStruct.MyElement’ (aka ‘Int’) is not convertible to ‘String’

Swift集合类型的逻辑相同:

extension Array where Element == String {
    func sayHello() {
        print("Hello")
    }
}

转载注明原文:swift – 什么是“元素”类型? - 代码日志