Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Swift中使用firstIndex(of:Character)时是否总是需要Nil合并?_Swift_String - Fatal编程技术网

在Swift中使用firstIndex(of:Character)时是否总是需要Nil合并?

在Swift中使用firstIndex(of:Character)时是否总是需要Nil合并?,swift,string,Swift,String,摘自苹果公司的Swift编程语言Swift 4.2文档 let greeting = "Hello, world!" let index = greeting.firstIndex(of: ",") ?? greeting.endIndex let beginning = greeting[..<index] 除了我排除代码中的Nil合并部分之外,上面的示例工作得非常好 let beginning = greeting[..<greeting.firstIndex(of: ","

摘自苹果公司的Swift编程语言Swift 4.2文档

let greeting = "Hello, world!"
let index = greeting.firstIndex(of: ",") ?? greeting.endIndex

let beginning = greeting[..<index]
除了我排除代码中的Nil合并部分之外,上面的示例工作得非常好

let beginning = greeting[..<greeting.firstIndex(of: ",")]
省去了??greeting.endIndex,Xcode返回一个错误

问题是为什么有必要这样做?
为什么我们不能直接使用firstIndex访问子字符串。

因为它可能不是所提供字符的索引,所以按照您的方式应用程序将崩溃

 func firstIndex(of element: Character) -> String.Index?
可选的返回字符串.Index?解决它,这就是为什么你需要

如果你不提供


然后您必须强制展开let start=greeting[…,因为它可能不是所提供字符的索引,所以按照您的方式应用程序将崩溃

 func firstIndex(of element: Character) -> String.Index?
可选的返回字符串.Index?解决了这个问题,这就是为什么需要

如果你不提供

然后您必须强制展开let start=greeting[…考虑这个示例

let greeting = "Hey There!"
let index = greeting.firstIndex(of: ",")
索引的类型为index?,因此可以为nil。由于字符串没有“,”,因此索引的值为nil

因此,此代码变得非法。因为索引不能是可选值

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,它不是有效的索引,但它是 提问。字符串中是否有“,”符号?问题是,下一部分。切片数组需要有一个有效的索引,因此您的索引当前是可选的,您可以通过像我的示例一样安全地展开或在获取索引时进行无合并检查来更改为有效索引

您应该在Swift中查找选项以获得更好的理解。

考虑这个例子

let greeting = "Hey There!"
let index = greeting.firstIndex(of: ",")
索引的类型为index?,因此可以为nil。由于字符串没有“,”,因此索引的值为nil

因此,此代码变得非法。因为索引不能是可选值

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,它不是有效的索引,但它是 提问。字符串中是否有“,”符号?问题是,下一部分。切片数组需要有一个有效的索引,因此您的索引当前是可选的,您可以通过像我的示例一样安全地展开或在获取索引时进行无合并检查来更改为有效索引


您应该在Swift中查找选项以更好地理解。

索引显然是可选的,因此它可以返回nil,我认为它可以返回nil?@RakeshaShastri是的,这就是原因。是的,我说这是一个有效的响应。为什么它会抛出错误?它只能返回nil?为什么像他说的那样??greeting.endIndex是强制性的?好的我的错。错误会在下一行返回。哇,这很有道理。索引显然是可选的,所以它可以返回nil,我认为它是这样的?@RakeshaShastri是的,这就是原因。是的,我说这是一个有效的响应。为什么它会抛出错误?它可以只返回nil?为什么像他说的那样??greeting.endIndex是强制性的?好的,我的糟糕。错误会在下一行返回。哇,这很有道理。谢谢你的帮助!这个例子远远超出了我对语言的理解,因为我是初学者,但它不会伤害我。@Slick我编辑了我的答案,这应该可以帮助你更好地理解这个问题。:谢谢!我学会了可选的。更新后的答案确实会让你更容易理解问题se.一旦您了解了什么是可选的,您可以检查如何使用guard和if let安全地打开可选。此外,并不总是需要进行nil合并。您可以将变量作为可选变量,因为有时您会处理nil情况以及有效情况。感谢您的帮助!这个示例超出了我的理解范围因为我是一名初学者,所以对这门语言进行了修改,但不会有任何伤害。@Slick我已经编辑了我的答案,这将有助于你更好地理解这个问题。:谢谢!我已经学习了可选的。更新后的答案确实很有意义。一旦你学会了可选的选项 最后,您可以检查如何使用防护装置安全地打开选项,如果允许的话。此外,并不总是需要进行零合并。您可以将该变量作为可选变量,因为有时您会处理nil情况和有效情况。