为什么 skipWhile 在这些例子中表现不同?
Why does skipWhile behave differently in these examples?
在第一个例子中,我的终端输出
next(1)
next(2)
next(3)
next(4)
next(5)
next(6)
next(7)
next(8)
next(9)
next(10)
completed
第二个例子输出
next(3)
next(6)
next(8)
next(9)
completed
我知道每个值都不同,但我希望第一个示例应用了过滤,因此它遵循我的 .skipWhile { [=13=] % 2 == 0 }
块
中的逻辑
func skipWhile() {
let bag = DisposeBag()
Observable
.from(Array(1...10))
.skipWhile { [=12=] % 2 == 0 }
.subscribe { print([=12=]) }
.disposed(by: bag)
Observable
.from([2,3,6,8,9])
.skipWhile { [=12=] % 2 == 0 }
.subscribe { print([=12=]) }
.disposed(by: bag)
}
skipWhile()
skipWhile
不是 filter
。当谓词为真时,它会跳过可观察对象生命周期开始时的元素。一旦出现不再满足谓词的元素,它就会打开闸门,让其他一切通过。
您的第一个 observable 说“跳过所有内容,直到第一个奇数”。第一个元素是奇数,因此不会跳过任何内容,这就是为什么您会看到所有数组元素都被打印出来的原因。
如果您在第二个可观察对象中注意到,您没有过滤掉偶数(因为有一个 8
)。您只是跳过了第一个奇数 (3
) 之前的元素,导致 2
被跳过。
旁注
Int.isMultiple(of: )
是在Swift5中添加的,建议您在这种情况下使用。它只是使它更清楚,并且 side-steps 由误读 ==
与 !=
.
引起的错误
Observable
.from(Array(1...10))
.skipWhile { [=10=].isMultiple(of: 2) }
.subscribe { print([=10=]) }
.disposed(by: bag)
你甚至可以命名你的谓词:
let isEven: (Int) -> Bool = { [=11=].isMultiple(of: 2) }
Observable
.from(Array(1...10))
.skipWhile(isEven)
.subscribe { print([=11=]) }
.disposed(by: bag)
或者我最喜欢的,将其添加为计算 属性:
extension BinaryInteger {
var isEven: Bool { return self.isMultiple(of: 2) }
var isOdd: Bool { return !self.isEven }
}
Observable
.from(Array(1...10))
.skipWhile(\.isEven)
.subscribe { print([=12=]) }
.disposed(by: bag)
在第一个例子中,我的终端输出
next(1)
next(2)
next(3)
next(4)
next(5)
next(6)
next(7)
next(8)
next(9)
next(10)
completed
第二个例子输出
next(3)
next(6)
next(8)
next(9)
completed
我知道每个值都不同,但我希望第一个示例应用了过滤,因此它遵循我的 .skipWhile { [=13=] % 2 == 0 }
块
func skipWhile() {
let bag = DisposeBag()
Observable
.from(Array(1...10))
.skipWhile { [=12=] % 2 == 0 }
.subscribe { print([=12=]) }
.disposed(by: bag)
Observable
.from([2,3,6,8,9])
.skipWhile { [=12=] % 2 == 0 }
.subscribe { print([=12=]) }
.disposed(by: bag)
}
skipWhile()
skipWhile
不是 filter
。当谓词为真时,它会跳过可观察对象生命周期开始时的元素。一旦出现不再满足谓词的元素,它就会打开闸门,让其他一切通过。
您的第一个 observable 说“跳过所有内容,直到第一个奇数”。第一个元素是奇数,因此不会跳过任何内容,这就是为什么您会看到所有数组元素都被打印出来的原因。
如果您在第二个可观察对象中注意到,您没有过滤掉偶数(因为有一个 8
)。您只是跳过了第一个奇数 (3
) 之前的元素,导致 2
被跳过。
旁注
Int.isMultiple(of: )
是在Swift5中添加的,建议您在这种情况下使用。它只是使它更清楚,并且 side-steps 由误读 ==
与 !=
.
Observable
.from(Array(1...10))
.skipWhile { [=10=].isMultiple(of: 2) }
.subscribe { print([=10=]) }
.disposed(by: bag)
你甚至可以命名你的谓词:
let isEven: (Int) -> Bool = { [=11=].isMultiple(of: 2) }
Observable
.from(Array(1...10))
.skipWhile(isEven)
.subscribe { print([=11=]) }
.disposed(by: bag)
或者我最喜欢的,将其添加为计算 属性:
extension BinaryInteger {
var isEven: Bool { return self.isMultiple(of: 2) }
var isOdd: Bool { return !self.isEven }
}
Observable
.from(Array(1...10))
.skipWhile(\.isEven)
.subscribe { print([=12=]) }
.disposed(by: bag)