什么是Swift与JavaScript的Array.some()和Array.every()的对应部分?

时间:2016-04-04 14:24:59

标签: arrays swift list-comprehension

Swift为map提供filterreduceArray,...,但我找不到some(或any)或every(或all),其中JavaScript的对应部分为Array.someArray.every。我不够努力或存在吗?

related question here正在寻找Swift all方法,但JS程序员可能找不到它(JS中没有allsome或{{1}没有提到)。

2 个答案:

答案 0 :(得分:5)

只需使用contains

// check if ALL items are completed
// so it does not contain a single item which is not completed
!items.contains { !$0.completed }

// check if SOME item is completed
// so test if there is at least one item which is completed
items.contains { $0.completed }

答案 1 :(得分:4)

要替换any / some,您可以使用SequenceType的contains方法(有一个版本采用布尔谓词;另一个版本采用一个元素,仅适用于Equatable序列元件)。

没有像all / every这样的内置函数,但您可以使用扩展程序轻松编写自己的函数:

extension SequenceType
{
    /// Returns `true` iff *every* element in `self` satisfies `predicate`.
    func all(@noescape predicate: Generator.Element throws -> Bool) rethrows -> Bool
    {
        for element in self {
            if try !predicate(element) {
                return false
            }
        }
        return true
    }
}

或者,感谢De Morgan,您可以否定contains!array.contains{ !predicate($0) }的结果。

顺便说一句,这些工作在任何SequenceType上,而不仅仅是Array。这包括Set和even Dictionary(其元素为(key, value)元组)。