Xcode 10.2中下标的模棱两可使用

时间:2019-04-09 01:37:54

标签: arrays swift xcode swift-extensions

我有一个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中现在存在编译器错误。

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

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

1 个答案:

答案 0 :(得分:1)

我无法解释为什么这在以前的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]
    }
}

也许我需要澄清我的意图。 (感谢Nate。)

您可以将第二个下标设为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声明使用不同的标签,以避免产生歧义。