如何在iOS Swift 4.2中从范围中获取SubString

时间:2019-07-19 18:17:58

标签: swift string swift4.2

我是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).

1 个答案:

答案 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]
}