字符串索引在swift中

时间:2017-10-27 08:43:11

标签: swift

let greeting = "Hello World"
greeting[greeting.startIndex]

此代码将打印字符串" H"

的第一个字符
let = "Hello World"
greeting.startIndex
greeting.endIndex

有什么区别?这件事什么都不做。

即使我没有收到错误
greeting.endIndex

当然我不是通过下标语法检索字符串值,而是在我找到的Substring主题

greeting.endIndex

只打印

string.index

好的,让我解释一下我询问string.indexgreeting.endIndex

的原因
let greeting = "Hello_world!"
let index = greeting.index(of: "_") ?? greeting.endIndex
let beginning = greeting[..<index]
// beginning is "Hello"

这段代码与substring有关,我完全理解它在做什么,在第二行代码中有Nil-Coalescing Operator,你知道它是什么。但是,如果

let greeting = "Hello world!"
let index = greeting.index(of: "_") ?? greeting.endIndex
let beginning = greeting[..<index]
// beginning is "Hello world"

如果字符串值中没有"_",则表示greeting.index(of: "_")nil,那么它应该返回默认值greeting.endIndex,因为Nil-Coalescing Operator正确。那么为什么greeting.endIndex返回`&#34; Hello world!&#34;

3 个答案:

答案 0 :(得分:1)

如果您在非空字符串中描述第一个字符的startIndex返回位置,并且endIndex返回的位置大于最后一个有效的下标参数。

同样在Swift的第4版中。字符串表示为Collection。

所以当你这样做时:

greeting[greeting.startIndex]

您要求greeting字符串在第一个位置返回元素“H”

答案 1 :(得分:1)

您的代码什么都不做。但是这段代码

let greeting = "Hello"

print(greeting[greeting.startIndex]) // Prints 'H'
print(greeting[greeting.endIndex])

导致致命错误,因为greeting.endIndex实际上“指向”字符串结尾之后,因此最后一个语句是数组边界违规。

答案 2 :(得分:1)

startIndex是字符串的开头。 endIndex是字符串的结尾。您可以在构建范围时或从其中一个或两个创建新索引作为offsetBy时使用这些索引。

因此,例如,如果您想要排除第一个和最后一个字符的Substring,则可以将fromIndex设置为startIndex加1和toIndexendIndex少1,屈服:

let string = "Hello World"
let fromIndex = string.index(string.startIndex, offsetBy: 1)
let toIndex = string.index(string.endIndex, offsetBy: -1)
let substring = string[fromIndex..<toIndex]                // "ello Worl"

然后你问:

  

如果字符串值中没有"_",则表示greeting.index(of: "_")nil,那么它应该返回默认值greeting.endIndex,因为Nil-Coalescing Operator正确。那么为什么greeting.endIndex返回`&#34; Hello world!&#34;

确保您不会混淆string[index]语法(返回Character)和string[..<index]Substring返回startIndex }最多index(即&#34;返回Substring所有内容index&#34;):

let beginning = greeting[..<index]

这个部分约束范围只是:

let beginning = greeting[greeting.startIndex..<index]

因此,当您将index默认为greeting.endIndex时,这就像是说您想要一个有效的整个字符串的子字符串:

let beginning = greeting[greeting.startIndex..<greeting.endIndex]

因此,如果找不到greeting[..<index]并使用_,则问题[{1}}中显示的语法会返回整个字符串。

顺便说一句,如果您想要不同的行为,即如果找不到endIndex则返回空子字符串,您可以执行以下操作:

_

或者,如果您觉得有点太可爱,只需采用标准的安全展开模式,例如:

let index = greeting.index(of: "_") ?? greeting.startIndex
let beginning = greeting[..<index]