一尘不染

当不涉及Int时,为什么String.subscript(_ :)要求类型String.Index和Int相等?

swift

我无法理解Xcode在此行面临的问题:

iteration.template = template[iterationSubstring.endIndex...substring.startIndex]

template是一个StringiterationSubstringsubstringSubstringtemplate。Xcode用以下消息突​​出显示方括号:

下标’subscript(_ :)’要求类型’Substring.Index’和’Int’是等效的

错误消息对我来说没有任何意义。我尝试Substring通过创建Range<String.Index>带有[template.startIndex...template.endIndex]下标的来获得。这有Int什么关系?为什么相同的模式在其他地方也起作用?


Xcode操场代码重现该问题:

import Foundation
let template = "This is an ordinary string literal."

let firstSubstringStart = template.index(template.startIndex, offsetBy: 5)
let firstSubstringEnd = template.index(template.startIndex, offsetBy: 7)
let firstSubstring = template[firstSubstringStart...firstSubstringEnd]

let secondSubstringStart = template.index(template.startIndex, offsetBy: 10)
let secondSubstringEnd = template.index(template.startIndex, offsetBy: 12)
let secondSubstring = template[secondSubstringStart...secondSubstringEnd]

let part: String = template[firstSubstring.endIndex...secondSubstring.startIndex]

毕竟,我有一个模板字符串和它的两个子字符串。我想要一个String从第一个结尾Substring到第二个开始的范围Substring


阅读 349

收藏
2020-07-07

共1个答案

一尘不染

当前版本的Swift使用Substring切片的结构String

错误似乎是误导性的,如果你要一个(范围下标)分配发生SubstringString变化。

要解决该错误,请StringSubstring

iteration.template = String(template[iterationSubstring.endIndex...substring.startIndex])

但是,强烈建议您不要使用具有不同字符串(iterationSubstringsubstring)的索引来创建范围。切片主字符串,保留索引。


第二个(同时删除)示例中的崩溃是因为字符串的最后一个字符 位于索引beforeendIndex,它是

template[template.startIndex..<template.endIndex]

或更短

template[template.startIndex...]
2020-07-07