【问题标题】:How to get the some part from string which has emoj using nsrange如何使用nsrange从具有表情符号的字符串中获取某些部分
【发布时间】:2026-01-25 11:55:01
【问题描述】:

我的文本中包含表情符号,我必须使用 Nsrange 获取子字符串。

由于表情符号,我没有得到子字符串,我正在使用下面的代码来查找子字符串,并且当表情符号不存在时它工作正常。感谢您的快速解答。

    extension String {
    //for finding the range
    func nsRanges(ofWord word: String) -> [NSRange] {
        var ranges: [NSRange] = []
        self.enumerateSubstrings(in: startIndex..., options: .byWords) {
            (substring, range, _, _) in

            let subrange = NSRange(range, in: self)

            let othersubstring = self.substring(location: subrange.location, length: word.count + 1)
           if othersubstring != nil{
                if othersubstring!  == word + " " {
                    ranges.append(NSRange(location: subrange.location, length: word.count))

                }
            }
        }
        return ranges
    }
    //for substring *emphasized text*
    func substring(location: Int, length: Int) -> String? {
        guard self.utf16.count >= location + length else {

            return nil
        }
        let start = index(startIndex, offsetBy: location)
        let end = index(startIndex, offsetBy: location + length)
        return substring(with: start..<end)
    }
}

【问题讨论】:

标签: ios swift string nsrange


【解决方案1】:

不要使用NSRange 在 Swift 中获取子字符串。

有两个方便的 API 可以将 NSRange 转换为 Range&lt;String.Index&gt;,反之亦然

  • init?(_ range: NSRange, in string: String) inRange
  • NSRange(_ range: Range&lt;String.Index&gt;, in string: StringProtocol)NSRange

例如将第二个函数替​​换为

extension String {

    func substring(location: Int, length: Int) -> String? {
        let nsRange = NSRange(location: location, length: length)
        guard let range = Range(nsRange, in: self) else { return nil }
        return String(self[range])
    }
}

【讨论】: