Xcode 10.2 中下标的使用不明确

Ambiguous use of subscript in Xcode 10.2

我有一个 Swift 项目,我在其中对任何集合类型使用了 2 个扩展。它们允许安全访问数组中的元素。这是扩展名:

subscript (safe index: Index) -> Element? {
    return indices.contains(index) ? self[index] : nil
}

subscript (safe int: Int) -> Element? {
    let index = self.index(self.startIndex, offsetBy: int)
    return self[index]
}

效果很好,但在 Xcode 10.2 中现在出现编译器错误。

我试图尽可能明确地说明下标中的类型和元素的类型,但没有奏效。

有谁知道为什么这不再有效?

我无法解释为什么这在以前的 Xcode 版本中有效,但是当 Collection.Index == Int 时,您不认为您的两个 subscript(safe:) 不够模棱两可吗?

并且,对于您的第二个 subscript(safe:),单词 safe 似乎不合适,因为当 int 超出集合范围时,它很容易使您的应用程序崩溃。

extension Collection {
    subscript (safe index: Index) -> Element? {
        return indices.contains(index) ? self[index] : nil
    }

    subscript (safe int: Int) -> Element? {
        let index = self.index(self.startIndex, offsetBy: int)
        return self[index]
    }
}
var arr: [String] = ["a"]
print(arr[safe: 1])

导致 Thread 1: Fatal error: Index out of rangereturn self[index]。 (使用 Xcode 10.1 测试。)

第二个 subscript 最好使用 safe 以外的词,而且 subscript 在任何版本的 Xcode 中都不会产生歧义。

extension Collection {
    subscript (safe index: Index) -> Element? {
        return indices.contains(index) ? self[index] : nil
    }

    subscript (offsetBy int: Int) -> Element? {
        let index = self.index(self.startIndex, offsetBy: int)
        return self[index]
    }
}

也许我需要澄清一下我的意图。 (感谢内特。)

您可以将第二个下标设为 safe:

extension Collection {
    subscript (safe index: Index) -> Element? {
        return indices.contains(index) ? self[index] : nil
    }

    subscript (offsetBy int: Int) -> Element? {
        let index = self.index(self.startIndex, offsetBy: int)
        return self[safe: index]
    }
}

即使在这种情况下,您最好为两个 subscript 声明使用不同的标签以避免歧义。