摘录自Apple的 Swift编程语言(Swift 4.2)文档。
let greeting = "Hello, world!"
let index = greeting.firstIndex(of: ",") ?? greeting.endIndex
let beginning = greeting[..<index]
除了我排除了代码的Nil-coalescing部分之后,上面的示例完全正常工作。
let beginning = greeting[..<greeting.firstIndex(of: ",")]
通过省略?? greeting.endIndex
,Xcode返回错误。
问题是为什么有必要?
为什么我们不能直接使用firstIndex()
来访问子字符串。
答案 0 :(得分:2)
因为它可能不是所提供字符的索引,所以按照您的方式,该应用将崩溃
func firstIndex(of element: Character) -> String.Index?
可选的return String.Index?
解决了这个问题,这就是为什么需要??
如果您不提供??
然后,您必须强制展开let beginning = greeting[..<index]
,此处的索引应为index!
,如果索引为零,则会导致崩溃
答案 1 :(得分:2)
请考虑以下示例。
let greeting = "Hey There!"
let index = greeting.firstIndex(of: ",")
index
的类型为Index?
,因此可以为零。由于字符串中没有',',所以index的值为nil。
因此此代码变为非法。由于index不能为可选值。
let beginning = greeting[..<index]
您也可以将其解开并获取索引(如果它是有效索引),
guard let indexFound = index else {
print("Character not) found in string"
return
}
let beginning = greeting[..<indexFound]
print("The first occurance of the character is at \(beginning).")
真实世界的示例:(我知道这不好,但是应该足够了:x)
还记得在网站上弹出的机器人验证码吗?那些问 您可以确定汽车,路牌等的数量。 单击显示要求的框。然后点击“提交”。但 如果没有,请点击“跳过”。因此绘制相似之处。如果你 有一个有效的索引,它返回有效的索引,否则返回
nil
(不是有效的Index
),但这是对 问的问题。 (字符串中是否有','?)问题出在下一部分。切片数组需要您具有有效的Index
,因此您的index
当前是可选的,您可以像我的示例一样安全地展开或在当时进行n-coalescing检查,从而将其更改为有效索引获取索引的方法。
您应该在Swift中查找可选项,以便更好地理解
。