LoginSignup
4
4

More than 5 years have passed since last update.

【Swift】Pythonでのall, anyをSwiftで。

Last updated at Posted at 2015-11-18

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

4
4
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4