【Tips】Range & NSRange

前言

做個(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ǔ)充

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Swift 介紹 簡(jiǎn)介 Swift 語(yǔ)言由蘋果公司在 2014 年推出,用來(lái)撰寫 OS X 和 iOS 應(yīng)用程序 ...
    大L君閱讀 3,423評(píng)論 3 25
  • OC中的類分為可變和不可變。下表列出了Foundation框架中主要的可變類和不可變類: 種類 不可變類 可變類 ...
    陳_振閱讀 603評(píng)論 0 0
  • 他很老實(shí),他很勤快,他很熱心腸…… 2017年那是一個(gè)寒冷的夜晚,涼風(fēng)習(xí)習(xí)剛下完自修躺上床玩了一會(huì)手機(jī),心頭一熱點(diǎn)...
    Summercharm閱讀 527評(píng)論 1 2
  • 說(shuō)起龍蝦又想起以前,在多年以前去南京住過一小段時(shí)間,那兒的龍蝦可真多,門前的渠道里有龍蝦游來(lái)游去,朋友問我想不想吃...
    太陽(yáng)笑瞇瞇閱讀 1,034評(píng)論 18 35
  • 普天之下的愛情,大概都一個(gè)模樣: “剛開始時(shí)是甜蜜的糖罐,一頭深扎欲罷不能;結(jié)束時(shí)往往令人痛不欲生,眷戀不舍?!?...
    不辭而別的秋天閱讀 2,380評(píng)論 3 6

友情鏈接更多精彩內(nèi)容