首页 > 解决方案 > Xcode 10.2 中下标的模糊使用

问题描述

我有一个 Swift 项目,其中我在任何 Collection 类型上使用 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 中现在存在编译器错误。

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

有谁知道为什么这不再起作用?

标签: arraysswiftxcodeswift-extensions

解决方案


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

而且,对于您的第二个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 range就行return self[index]。(使用 Xcode 10.1 测试。)

你应该更好地使用另一个词而不是safe你的第二个词subscript,并且这两个词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声明使用不同的标签以避免歧义。


推荐阅读