Swift - 实现NSRange与Range的相互转换
相较于 OC 的 NSRange,Swift 的 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 后对字符串进行截取。
(2)运行结果如下:
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)运行结果如下: