为什么 String.subscript(_:) 要求类型 `String.Index` 和 `Int` 在不涉及 `Int` 时相等?
Why does String.subscript(_:) require the types `String.Index` and `Int` to be equal when there is no `Int` involved?
我无法理解 Xcode 在这一行中遇到的问题:
iteration.template = template[iterationSubstring.endIndex...substring.startIndex]
template
是 String
,iterationSubstring
和 substring
是 template
的 Substring
。 Xcode 使用以下消息突出显示左方括号:
Subscript 'subscript(_:)' requires the types 'Substring.Index' and 'Int' be equivalent
错误消息对我来说没有任何意义。我尝试通过创建带有 [template.startIndex...template.endIndex]
下标的 Range<String.Index>
来获得 Substring
。这与 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
的开头。
Swift 的当前版本使用 Substring
结构,它是一个切片 String
。
如果您要将(范围下标的)Substring
分配给 String
变量,就会出现该错误。
要修复错误,请从 Substring
创建一个 String
iteration.template = String(template[iterationSubstring.endIndex...substring.startIndex])
然而,强烈建议您不要使用来自不同字符串(iterationSubstring
和 substring
)的索引创建范围。切片主字符串,保留索引。
第二个(同时删除)示例中的崩溃发生是因为字符串的最后一个字符 在 endIndex
之前的索引处,它是
template[template.startIndex..<template.endIndex]
或更短
template[template.startIndex...]
我无法理解 Xcode 在这一行中遇到的问题:
iteration.template = template[iterationSubstring.endIndex...substring.startIndex]
template
是 String
,iterationSubstring
和 substring
是 template
的 Substring
。 Xcode 使用以下消息突出显示左方括号:
Subscript 'subscript(_:)' requires the types 'Substring.Index' and 'Int' be equivalent
错误消息对我来说没有任何意义。我尝试通过创建带有 [template.startIndex...template.endIndex]
下标的 Range<String.Index>
来获得 Substring
。这与 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
的开头。
Swift 的当前版本使用 Substring
结构,它是一个切片 String
。
如果您要将(范围下标的)Substring
分配给 String
变量,就会出现该错误。
要修复错误,请从 Substring
String
iteration.template = String(template[iterationSubstring.endIndex...substring.startIndex])
然而,强烈建议您不要使用来自不同字符串(iterationSubstring
和 substring
)的索引创建范围。切片主字符串,保留索引。
第二个(同时删除)示例中的崩溃发生是因为字符串的最后一个字符 在 endIndex
之前的索引处,它是
template[template.startIndex..<template.endIndex]
或更短
template[template.startIndex...]