相较于
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 后对字符串进行截取。
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)")
运行结果: 截取后的字符串:han