let greeting = "Hello World"
greeting[greeting.startIndex]
此代码将打印字符串" H"
的第一个字符let = "Hello World"
greeting.startIndex
greeting.endIndex
有什么区别?这件事什么都不做。
即使我没有收到错误greeting.endIndex
当然我不是通过下标语法检索字符串值,而是在我找到的Substring主题
中greeting.endIndex
只打印
string.index
好的,让我解释一下我询问string.index
和greeting.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;
答案 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和toIndex
为endIndex
少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]