2016-04-04 8 views
1

スウィフトはArray年代のために...、mapfilterreduceを提供していますが、私は、そのカウンターパートJavaScriptでArray.someArray.everyあるsome(またはany)またはevery(またはall)を求めるわけではありません。私は十分に見張っていないのですか、それとも存在していますか?JavaScriptのArray.some()とArray.every()のSwiftの対応は何ですか?

related question hereはスウィフトall方法を探していますが、JSプログラマは、おそらく(言及されていない何のJSでallsomeまたはanyありません)、それを見つけることができません。 any/someを交換するために

+0

私が知る限り、それらは実装されておらず、自分で実装する必要があります。私は間違っている可能性があります。 – Henningsson

+0

@ eric-d 'filter 'などで再実装する方法を理解できず、それらを短絡させます(結果が判明したら停止します)。 – wcochran

+3

"some"は 'contains()'です。 「すべて」については、たとえばhttp://stackoverflow.com/questions/35061150/what-is-the-swift-equivalent-of-c-net-linqs-enumerable-all-methodを参照してください。 –

答えて

3

、あなたはSequenceTypeのcontains方法(ブール述語を取る1つのバージョンがあります。もう一つは、要素を取り、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) }

ところで、これらはArrayだけでなく、どのSequenceTypeでも機能します。これにはSetとEven Dictionary(要素が(key, value)のタプル)が含まれます。

+1

ありがとうございます - 'contains'は両方の問題のチケットです(私はあなたのシーケンス拡張コードの周りを頭で囲んでいます)。 – wcochran

+0

混乱していることは何でもお気軽に。私は[ブログの投稿](https://bandes-stor.ch/blog/2015/11/28/help-yourself-to-some-swift/)を書きました。助けて;公式のドキュメントは[こちら](https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Extensions.html)です。 – jtbandes

+0

ちょうど '@ noescape'について読む...スウィフトはマスターにしばらく時間がかかるようです。 – wcochran

0

containsをそのまま使用してください。

// check if ALL items are completed 
!items.contains(where: { $0.completed == false }) 

// check if SOME item is not completed 
items.contains(where: { $0.completed == false }) 
関連する問題