当前位置: > > > Swift - 实现NSRange与Range的相互转换

Swift - 实现NSRange与Range的相互转换

相较于 OC NSRangeSwift Range 更加复杂,用法也有很大的区别。虽然通常来说我们在 Swift 中使用 Range 就可以了,但有些情况下还是要使用 NSRange,比如创建富文本的时候。下面演示如何实现 NSRange Range 的相互转换。

1,扩展String,增加转换方法

为方便使用,这里对 String 做个扩展,增加两个新方法实现二者的转换。
extension String {
    
    //Range转换为NSRange
    func nsRange(from range: Range<String.Index>) -> NSRange {
        let from = range.lowerBound.samePosition(in: utf16)
        let to = range.upperBound.samePosition(in: utf16)
        return NSRange(location: utf16.distance(from: utf16.startIndex, to: from),
                       length: utf16.distance(from: from, to: to))
    }
    
    //Range转换为NSRange
    func range(from nsRange: NSRange) -> Range<String.Index>? {
        guard
            let from16 = utf16.index(utf16.startIndex, offsetBy: nsRange.location,
                                     limitedBy: utf16.endIndex),
            let to16 = utf16.index(from16, offsetBy: nsRange.length,
                                   limitedBy: utf16.endIndex),
            let from = String.Index(from16, within: self),
            let to = String.Index(to16, within: self)
            else { return nil }
        return from ..< to
    }
}

2,使用样例 

(1)下面代码我们先定义一个 NSRange,将其转为 Range 后对字符串进行截取。
let nsRange = NSRange(location: 0, length: 3)

let str = "hangge.com"
let range = str.range(from: nsRange)

let subStr = str.substring(with: range!)
print("截取后的字符串:\(subStr)")

(2)运行结果如下:
评论0