如何在iOS Swift 4.2中从范围中获取子字符串

如何在iOS Swift 4.2中从范围中获取子字符串,swift,string,swift4.2,Swift,String,Swift4.2,我是swift新手,我想从指定范围获取子字符串。但是我有一些错误 在从范围中获取子字符串时,我发现了类似的问题,但这些问题对我不起作用。我使用的是XCode 10.1和swift 4.2。从指定范围获取子字符串时出现获取错误。我试过这样做(示例代码) let textStr=“此处示例文本” 设newRange=NSMakeRange(4,9) 设startIndex=textStr?.index((textStr?.startIndex)!,偏移量:newRange.location) 让en

我是swift新手,我想从指定范围获取子字符串。但是我有一些错误

在从范围中获取子字符串时,我发现了类似的问题,但这些问题对我不起作用。我使用的是XCode 10.1和swift 4.2。从指定范围获取子字符串时出现获取错误。我试过这样做(示例代码)

let textStr=“此处示例文本”
设newRange=NSMakeRange(4,9)
设startIndex=textStr?.index((textStr?.startIndex)!,偏移量:newRange.location)
让endIndex=textStr?.index((textStr?.startIndex)!,偏移量:newRange.length)

让newHashtagRange=startIndex..您将得到一个错误,因为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]
}

你需要打开你的索引。顺便说一句,使用可选链接并强制展开结果是无意义的请发布您的实际代码
textStr
这不是可选的。您可以发送任何示例代码以从指定范围获取子字符串吗?这将对我更有帮助
let substring=textStr.prefix(4+9).suffix(9)
非常感谢你。非常感谢你。。。它起作用了
let newHashtagRange = startIndex..<endIndex
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]
}
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]
}