gpt4 book ai didi

swift - 为什么 skipWhile 在这些例子中表现不同?

转载 作者:可可西里 更新时间:2023-11-01 01:07:01 24 4
gpt4 key购买 nike

在第一个例子中,我的终端输出

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 { $0 % 2 == 0 } block

func skipWhile() {
let bag = DisposeBag()

Observable
.from(Array(1...10))
.skipWhile { $0 % 2 == 0 }
.subscribe { print($0) }
.disposed(by: bag)

Observable
.from([2,3,6,8,9])
.skipWhile { $0 % 2 == 0 }
.subscribe { print($0) }
.disposed(by: bag)

}
skipWhile()

最佳答案

skipWhile 不是过滤器。当谓词为真时,它会跳过可观察对象生命周期开始时的元素。一旦出现不再满足谓词的元素,它就会打开闸门,让其他一切通过。

您的第一个 observable 说“跳过所有内容,直到第一个奇数”。第一个元素是奇数,因此不会跳过任何内容,这就是为什么您会看到所有数组元素都被打印出来的原因。

如果您在第二个可观察对象中注意到,您没有过滤掉偶数(因为有一个 8)。您只是跳过了第一个奇数 (3) 之前的元素,导致 2 被跳过。

边注

Int.isMultiple(of: ) 已在 Swift 5 中添加,我建议您在这种情况下使用它。它只是让它更清晰,并避免了因误读 ==!= 而导致的错误。

Observable
.from(Array(1...10))
.skipWhile { $0.isMultiple(of: 2) }
.subscribe { print($0) }
.disposed(by: bag)

你甚至可以命名你的谓词:

let isEven: (Int) -> Bool = { $0.isMultiple(of: 2) }

Observable
.from(Array(1...10))
.skipWhile(isEven)
.subscribe { print($0) }
.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($0) }
.disposed(by: bag)

关于swift - 为什么 skipWhile 在这些例子中表现不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57087544/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com