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 range
行 return 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
声明使用不同的标签以避免歧义。
我有一个 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 range
行 return 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
声明使用不同的标签以避免歧义。