Swift:类型不符合协议'ArrayLiteralConvertible'

Swift: Type does not conform to protocol 'ArrayLiteralConvertible'

在我的 playground 中不断收到错误消息,提示 Set 不符合协议 'ArrayLiteralConvertible'


struct Set<T: Hashable> : ArrayLiteralConvertible {
    typealias Element = T
    private var contents: [Element: Bool]

    init() {
        self.contents = [Element: Bool]()
    }

    // easier initialization
    init<S: SequenceType where S.Generator.Element == Element>(_ sequence: S) {
        self.contents = [Element: Bool]()
        Swift.map(sequence) { self.contents[[=1=]] = true }
    }

    // allow Set creation through simple assignment using ArrayLiteralConvertible protocol
    internal static func convertFromArrayLiteral(elements: Element...) -> Set {
        return Set(elements)
    }
}

ArrayLiteralConvertible 协议需要 class

中的初始值设定项 init(arrayLiteral elements: Element...)
 init(arrayLiteral elements: Element...) {
     self = Set(elements)
 }

您不再需要实现 convertFromArrayLiteral 功能。它在 swift 的旧版本中。它在 iOS 8.1 API 中被弃用。你只需要上面的初始化程序。

https://developer.apple.com/library/ios/releasenotes/General/iOS81APIDiffs/modules/Swift.html

http://swiftdoc.org/protocol/ArrayLiteralConvertible/

ArrayLiteralConvertible 要求您实现 init(arrayLiteral: Element...) 类型的初始值设定项。像这样的事情会重新使用你的初始化程序,它需要一个序列:

init(arrayLiteral: Element...) {
    self = Set(arrayLiteral)
}

如果您在 playground 中执行此操作,请点击 opt-cmd-enter 以在助理编辑器中查看比仅从源代码中的错误消息中获得的更多详细信息。它显示了您未满足的所有协议要求的详细信息。

顺便说一句,如果你这样声明内容:

private var contents: [Element: Bool] = [:]

你不需要在每个初始化器中初始化它。

谢谢,你让我走上了正确的轨道。我在 github 上找到了一个要点,在语法上有一些 ArrayLiteralConvertible 的变化。它转到了这首曲子:

init(arrayLiteral elements: T...) {
        self.init(elements)
}

这似乎有效。