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的使用