我是Swift的新手,我想从指定范围获取子字符串。但是我遇到了一些错误。
我在从范围中获取subString时也发现了类似的问题,但是这些问题对我来说不起作用。我正在使用XCode 10.1和Swift 4.2。从指定范围获取子字符串时出现错误。我已经尝试过这样(示例代码)
let textStr = "Sample text here"
let newRange = NSMakeRange(4,9)
let startIndex = textStr?.index((textStr?.startIndex)!, offsetBy: newRange.location)
let endIndex = textStr?.index((textStr?.startIndex)!, offsetBy: newRange.length)
let newHashtagRange = startIndex..<endIndex
let newHashTagFound = textStr[newHashtagRange]
错误:
对于这一行代码,我遇到了以下错误
let newHashtagRange = startIndex..<endIndex
二进制运算符'.. <'无法应用于两个'String.Index?' 操作数
我只是从最近两天开始在这里建造。
但是在Objective-C中,只需要一行代码,例如SubStringFromRange(range).
答案 0 :(得分:1)
由于定义索引时具有可选链,因此startIndex和endIndex均为可选,因此您会收到错误消息。
这很奇怪,因为在您的示例代码中,textStr实际上不是可选的,并且可选链甚至无法编译。我的猜测是您正在尝试简化示例。我将假设textStr
是可选的,并向您展示如何避免使用强制展开,这几乎总是一个坏主意。此外,您将错误地获取结束索引。您需要从长度计算出的起始索引开始偏移。剩下的就是这个:
let textStr: String? = "Sample text here"
if let textStr = textStr {
let newRange = NSMakeRange(4,9)
let startIndex = textStr.index(textStr.startIndex, offsetBy: newRange.location)
let endIndex = textStr.index(startIndex, offsetBy: newRange.length)
let newHashtagRange = startIndex..<endIndex
let newHashTagFound = textStr[newHashtagRange]
}
但是,可以从可靠且内置的NSRange初始化范围(如果范围超出范围,它会返回可选):
let textStr: String? = "Sample text here"
let newRange = NSMakeRange(4,9)
if let textStr = textStr
, let newHashtagRange = Range(newRange, in: textStr)
{
let newHashTagFound = textStr[newHashtagRange]
}