Swift 中Range 和 NSRange的區(qū)別

NSRange

OC中的NSRange是一個(gè)結(jié)構(gòu)體,表示一個(gè)區(qū)間,通常配合NSString字符串使用

typedef struct _NSRange {
    NSUInteger location;
    NSUInteger length;
} NSRange;

location表示起始位置,length表示長度

NSRange range = NSMakeRange(0, 100);

Range

相比NSRange,Range(區(qū)間)要復(fù)雜的多,區(qū)間代表兩個(gè)值的區(qū)間,它由上邊界和下邊界進(jìn)行定義。

通過..<創(chuàng)建不包含上邊界的Range (左閉右開區(qū)間 [a...b) )

var range = 0..<10 //0 ~ 9 Range<Int>

通過 ... 創(chuàng)建包含上下邊界的ClosedRange( 閉區(qū)間 [a...b])

var cRange = "A"..."Z" //A ~ z   ClosedRange<Character>

Range<Bound>和ClosedRange<Bound>都是范型類型,Bound遵守Comparable協(xié)議

@frozen struct Range<Bound> where Bound : Comparable
@frozen struct ClosedRange<Bound> where Bound : Comparable

不能對(duì)普通Range和ClosedRange進(jìn)行迭代
范圍下界必須>= 范圍上界

CountableRange

可數(shù)范圍CountableRange和CountableClosedRange的范型Bound遵守Strideable(以整數(shù)為步長的協(xié)議) 這兩種范圍遵守Sequence協(xié)議可以被迭代,以及Sequence協(xié)議規(guī)定的操作

typealias CountableRange<Bound> = Range<Bound> where Bound : Strideable, Bound.Stride : SignedInteger

事實(shí)上CountableRange和CountableClosedRange是對(duì)原Range和ClosedRange的擴(kuò)展,只要邊界是整數(shù)就是可數(shù)的范圍

var range = 0..<10 //Range
var cRange = 0...10 //ClosedRange
// 可迭代
for i in range{
  print(i) // 0  1 2 3 4 5 6 7 8 9
}
//Sequence協(xié)議下的方法都適用
range.map { $0 }
//...

PartialRange

部分范圍是Range的變型版本,缺省一側(cè)邊界

PartialRangeUpTo缺少上邊界 ..<b

var pRangeUp = ..<10.0 //PartialRangeUpTo

PartialRangeThrough缺少上邊界 ...b

var pRangeT = ...10.0 //PartialRangeThrough

PartialRangeFrom缺少下邊界 a...

var pRangeF = 1.0... //PartialRangeFrom

CountablePartialRangeFrom<Int>可數(shù) 缺少下邊界 a<Int> ...

var cPRangeF = 0... //CountablePartialRangeFrom

只有CountablePartialRangeFrom可迭代

RangeExpression協(xié)議提供了contains判斷某個(gè)元素是否包含在區(qū)間,等效的~=

public protocol RangeExpression {  /// The type for which the expression describes a range.  associatedtype Bound: Comparable  func relative<C: Collection>(    to collection: C  ) -> Range<Bound> where C.Index == Bound  func contains(_ element: Bound) -> Bool}extension RangeExpression {  @inlinable  public static func ~= (pattern: Self, value: Bound) -> Bool {    return pattern.contains(value)  }  }

檢查某個(gè)元素在區(qū)間內(nèi) contains(:) 等效 ~=

// 存在某個(gè)元素range.contains(5) // true// 等效的是 ~=range ~= 5 // true

Range和ClosedRange相互轉(zhuǎn)換

一般情況下,Range和ClosedRange不可以相互轉(zhuǎn)換,所以遇到參數(shù)類型是Range函數(shù),也不能傳入ClosedRange,只有當(dāng)Range或者ClosedRange可數(shù)的時(shí)候,可以通過系統(tǒng)提供的方法轉(zhuǎn)換,或者手動(dòng)轉(zhuǎn)換。

var range = 0..<5
var crange = 0...5
//Range 轉(zhuǎn) ClosedRange
ClosedRange(range)//0...4
//ClosedRange 轉(zhuǎn) Range
Range(crange) // 0..<6

NSRange轉(zhuǎn)Range

NSRange 轉(zhuǎn)Range 返回 可選的Range

var ocRange:NSRange = NSMakeRange(0, 100)
var range = Range(ocRange) //Optional(Range(0..<100))

Range 轉(zhuǎn)NSRange ,Range必須是整數(shù)邊界

var range = 0..<10
var ocRange:NSRange = NSMakeRange(range.upperBound,range.count)
var ocRange1 = NSRange(range)

通常來說,純swift中很少遇到NSRange 轉(zhuǎn)Range的情況,但是iOS開發(fā)中的經(jīng)常會(huì)遇到NSString和String相互轉(zhuǎn)換,富文本NSMutableAttributeString的使用

?著作權(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),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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