2017/10/04 - Swift4に変更。(BooleanType
がなくなった。)
この記事について
Pythonにあるような、all
, any
をSwiftで実装してみました。
コード
extension Sequence where Element == Bool {
var any: Bool {
return reduce(false) { $0 || $1 }
}
var all: Bool {
return reduce(true) { $0 && $1 }
}
// -- 参考記事との比較として
var one: Bool {
return filter { $0 }.count == 1
}
var none: Bool {
return !any
}
}
func
版
extension Sequence where Element == Bool {
func any() -> Bool {
return reduce(false) { $0 || $1 }
}
func all() -> Bool {
return reduce(true) { $0 && $1 }
}
// -- 参考記事との比較として
func one() -> Bool {
return filter { $0 }.count == 1
}
func none() -> Bool {
return !any()
}
}
使い方
let boolArray = [true, false, false]
let boolArray2 = [true, true, true]
print(boolArray.any) // true
print(boolArray.all) // false
print(boolArray2.any) // true
print(boolArray2.all) // true
追記
@mono0926 さんからコメントをいただきました。
判定条件を指定できるようになります。
extension Sequence {
func any(f: ((Element) -> Bool)) -> Bool {
return reduce(false) { $0 || f($1) }
}
func all(f: ((Element) -> Bool)) -> Bool {
return reduce(true) { $0 && f($1) }
}
}
struct Mono {
let name: String
init(name: String) {
self.name = name
}
}
// 以下、nameが空文字のものが存在するか、nameが全て空文字かを判定
let monos = [Mono(name: ""), Mono(name: "foo")]
print(monos.any { $0.name.isEmpty }) // -> true
print(monos.all { $0.name.isEmpty }) // -> false
let monos2 = [Mono(name: ""), Mono(name: "")]
print(monos2.any { $0.name.isEmpty }) // -> true
print(monos2.all { $0.name.isEmpty }) // -> true
参考
Swiftのreduceで集合の条件確認用関数を書いた
Functional Snippet #5: Reduce · objc.io