import UIKit
///一共8种不同的Range
/// 半开范围 闭合范围
/// 元素满足Comparable Range ClosedRange
/// 元素满足Stideable CountableRange CountableCloseRange
///以上四种范围,每一种都对应一个前部分范围和后部分范围,所以4 x 2 = 8 种
///Range 范围代表两个值的区间,由上下边界进行定义。 ..< 创建半开半闭区间,...创建闭区间
let sigleDigitNumbers = 0..<10
let lowercaseLetters = Character("a")...Character("z")
///Mark 单边范围
let fromZero = 0...
let upToZ = ..<Character("z")
//1、Range:由..<创建的半开范围, 接受Bound泛型参数,Bound必须遵守comparable协议
//2、ClosedRange: 由...创建的必和范围
// Mark: 不能对range迭代,但是可以检查某个元素是否存在于某个范围中
sigleDigitNumbers.contains(8)
lowercaseLetters.overlaps("c"..<"z") //是否有重叠
//Mark:Range和cCloseRange既不是序列,也不是集合。
//Mark: 有一部分范围是序列,可以迭代: CountableRange 既:可数范围
for i in 0..<10 {
print(i)
}
//Mark: CountableRange在Range的基础上,添加了约束协议:它的元素类型需要遵守Strideable协议(以整数位步长)
//Mark: 可数范围的边界可以是整数或者指针,但不能是浮点数,这是因为stride中有整数的约束。
//迭代浮点数的方法
let re = stride(from: 0.5, to: 10.5, by: 1).map{$0}
print(re)
///Mark: 范围表达式:
///以上八种范围都满足RangeExpression协议:该协议主要为了配合集合切片使用
public protocol RangeExpression {
associatedtype Bound: Comparable
func contains(_ element: Bound) -> Bool
func relative<C>(to collection: C) -> Range<Self.Bound> where C : Collection, Self.Bound == C.Index
}
///Mark:对于下边界确实的部分范围,ralative(to:)方法会把集合类型的startIndex用作下边界,同理 endIndex用作上边界
网友评论