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

3

我在我的编程环境中一直收到一个错误,提示“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[$0] = true }
    }

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

4

ArrayLiteralConvertible 要求你实现一个类型为 init(arrayLiteral: Element...) 的初始化器。类似下面的代码将重用你的接受序列类型的初始化器:

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

如果你在playground中进行此操作,请按下opt-cmd-enter,在辅助编辑器中查看比源代码中错误消息更详细的细节。它显示了你未满足的所有协议要求的详细信息。
顺便说一句,如果你这样声明内容:
private var contents: [Element: Bool] = [:]

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


以前没见过这个键盘快捷键,谢谢! - Andrew Monshizadeh

1

0

谢谢,你让我找到了正确的方向。我在 Github 上发现了一个要素,其中有一些 ArrayLiteralConvertible 语法更改。它大致是这个调子:

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

这似乎有效。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接