Swift 中的 nil 或 "empty" 可数范围是多少?
What is the nil or "empty" countable range in Swift?
在Swift3,
let highestIndex = 7
for index in 1 ..< highestIndex {
latter(index)
}
然而,
let highestIndex = 0, or anything smaller
for index in 1 ..< highestIndex {
latter(index)
}
崩溃了。
因此,..< 运算符在大多数情况下是不切实际的。
所以,也许,像这样...
for index in (1 ..< highestIndex).safely() {
latter(index)
}
如何编写扩展名 safely
?
或者在最坏的情况下只是一个函数 safely(from,to)
,其中 returns 一个 CountableRange,或者一个“空”(?) 可数范围? (我不明白 Swift 扩展是否可以“捕获”错误?)
我可以让它正常工作:
for index in 1 ..< 1 {
latter(index)
}
对于<1
的情况,我推荐如下:
guard highestIndex > 0 else { return }
for index in 1 ..< highestIndex {
latter(index)
}
尽可能贴近 ..<
运算符,以下是 safely
.
的适当实现
public func safely<Bound>(_ minimum: Bound, _ maximum: Bound) -> CountableRange<Bound> where Bound : _Strideable & Comparable, Bound.Stride : Integer {
if maximum < minimum {
return CountableRange(uncheckedBounds: (lower: minimum, upper: minimum))
}
return CountableRange(uncheckedBounds: (lower: minimum, upper: maximum))
}
let one = safely(0, 12) // CountableRange(0..<12)
let two = safely(15, 12) // CountableRange(15..<15)
one.isEmpty // false
two.isEmpty // true
您可能需要考虑为参数提供更好的名称以指示它们是否包含/不包含边界等。
创建扩展并添加 .safely()
将不起作用,因为在创建 CountableRange
时会在调用 safely
之前检查边界。
我喜欢简单的解决方案:
let lowerIndex = 1
let higherIndex = 0
for index in lowerIndex ..< max(lowerIndex, higherIndex) {
latter(index)
}
在Swift3,
let highestIndex = 7
for index in 1 ..< highestIndex {
latter(index)
}
然而,
let highestIndex = 0, or anything smaller
for index in 1 ..< highestIndex {
latter(index)
}
崩溃了。
因此,..< 运算符在大多数情况下是不切实际的。
所以,也许,像这样...
for index in (1 ..< highestIndex).safely() {
latter(index)
}
如何编写扩展名 safely
?
或者在最坏的情况下只是一个函数 safely(from,to)
,其中 returns 一个 CountableRange,或者一个“空”(?) 可数范围? (我不明白 Swift 扩展是否可以“捕获”错误?)
我可以让它正常工作:
for index in 1 ..< 1 {
latter(index)
}
对于<1
的情况,我推荐如下:
guard highestIndex > 0 else { return }
for index in 1 ..< highestIndex {
latter(index)
}
尽可能贴近 ..<
运算符,以下是 safely
.
public func safely<Bound>(_ minimum: Bound, _ maximum: Bound) -> CountableRange<Bound> where Bound : _Strideable & Comparable, Bound.Stride : Integer {
if maximum < minimum {
return CountableRange(uncheckedBounds: (lower: minimum, upper: minimum))
}
return CountableRange(uncheckedBounds: (lower: minimum, upper: maximum))
}
let one = safely(0, 12) // CountableRange(0..<12)
let two = safely(15, 12) // CountableRange(15..<15)
one.isEmpty // false
two.isEmpty // true
您可能需要考虑为参数提供更好的名称以指示它们是否包含/不包含边界等。
创建扩展并添加 .safely()
将不起作用,因为在创建 CountableRange
时会在调用 safely
之前检查边界。
我喜欢简单的解决方案:
let lowerIndex = 1
let higherIndex = 0
for index in lowerIndex ..< max(lowerIndex, higherIndex) {
latter(index)
}