arrays - 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 中现在存在编译器错误。
我试图尽可能明确地说明下标中的类型和元素的类型,但没有奏效。
有谁知道为什么这不再起作用?
解决方案
我无法解释为什么这在以前版本的 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
声明使用不同的标签以避免歧义。
推荐阅读
- python - Python将文本值更改为数值输出
- c - 为什么扫描停止工作(使用内存分配)?
- sql - 带有两个函数的条件内连接
- amazon-web-services - Terraform 多个 cloudwatch 事件触发相同的 lambda 函数
- python - Python tkinter 标签在执行函数时移动
- python - 尝试使用 Xlwings/Python 保存 .xlsm 时出现 Com_Error
- python - plt.scatter() 图的行为类似于 Matplotlib 中的 plt.plot() 图
- c++ - 布局内存供 OpenGL 使用的问题(需要 glBufferSubData 帮助)
- php - 如何通过传递 JSON 多维数组使用 PHP cURL 发出 API 请求?
- java - 对于 java,SELinux 上下文似乎不正确