1

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

4

1 回答 1

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 初始化 Range(如果范围超出范围,它会返回一个可选值):

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]
}
于 2019-07-19T18:34:45.767 回答