前言
做個(gè)記錄,比較下兩者。
開始
NSRange OC中用來(lái)表示范圍的,筆者第一次接觸到是在截取字符串中:
let nsStr: NSString = "com.longjianjiang"
let nsNameRange = nsStr.range(of: "com")
上述結(jié)果為{0, 3}, 0為截取字符串的位置,3為截取字符串的長(zhǎng)度,信息很直觀;
但是筆者接觸到Swift后,第一次使用的Swift中的Range要算是for循環(huán)中:
for i in 0..<5 {
print(i)
}
而且Swift中把很多之前OC中用NSRange來(lái)表示范圍的都替換成了新的Range類型,比如同樣的字符串截?。?/p>
let str = "com??.longjianjiang"
let nameRange = str.range(of: "com??")
上述結(jié)果為Index(offset: 0)..<Index(offset: 20), 是一個(gè)開區(qū)間,上述offset指的的是作為Unicode的字符偏移;
用NSRange來(lái)進(jìn)行截取字符串時(shí),如果字符串中含有emoji,此時(shí)就會(huì)少截,因?yàn)閑moji比普通字符多占一個(gè)
let myNSRange = NSRange(location: 3, length: 3)
let myNSString: NSString = "longjianjiang"
print(myNSString.substring(with: myNSRange)) // "gji"
let myNSString2: NSString = "com??.longjianjiang"
print(myNSString2.substring(with: myNSRange)) // "??." 少了 l
Swift4中的String類的subString方法標(biāo)記為過時(shí),建議使用切片下標(biāo), 看來(lái)很推薦使用Range類型
但是在處理富文本的時(shí)候,方法中的范圍參數(shù)依然是之前的NSRange(不知道未來(lái)會(huì)不會(huì)也替換為Range)所以這時(shí)就涉及了如何兩個(gè)不同范圍類型的轉(zhuǎn)換,不過很簡(jiǎn)單,系統(tǒng)有提供方法;
let nsRange = NSRange(nameRange!, in: str) // str 為nameRange所在的字符串
let range = Range.init(nsRange)
對(duì)比兩者,其實(shí)我們可以發(fā)現(xiàn)新的Range類型所表達(dá)的東西比NSRange更多,用途也更加廣泛,不僅僅可以表示范圍,而且也可以用在循環(huán)中,所以這就引出了Range的不同類型:
其實(shí)根據(jù)上述我們知道不同Range有兩種類型,開閉區(qū)間的Range、是否可迭代的Range,組合一下就是四種??傻腞ange的元素得遵守Strideable協(xié)議,該協(xié)議說(shuō)明元素是連續(xù)的同時(shí)支持偏移計(jì)算,該協(xié)議繼承自Comparable,而且默認(rèn)的Range的元素就得遵守Comparable協(xié)議。
最后
有待補(bǔ)充