2017-03-10 16 views
1

私はSwift 3で[String:String]配列を持っていて、KeyにString値が含まれているかどうかによってこの配列内の特定の項目を探したいと思います。Swift 3ディクショナリを最初に実装する方法(where :) closure

   let result = collection.first(where: ((key, value) -> Bool in 
        return key.contains("mystring"))) 

しかし、Xcodeは「表現のリストで期待される表現」と伝え続けます。私は今、1時間のためにグーグルで、この閉包を含んでいるすべてのウェブサイトは、包括的またはフィルター的な方法で正しい構文のようです。

私はここで何が欠けていますか?あなたはさらに{ }

の代わりに()を使用しているため

答えて

4

あなたが実際に、閉鎖を行っていない、first(where:)のための閉鎖は(Dictionary<Key, Value>.Iterator.Element) throws -> Bool型を持ちます。パラメータは、反復の(Key, Value)のペアである単一のタプルです。

代わりに、これを試してみてください:

let result = collection.first(where: { pair -> Bool in 
    return pair.key.contains("mystring") 
}) 

をしかし、あなたが作ることができるいくつかの単純化があります。

  1. Bool戻り値の型を推論することができます。
  2. 単一式のクロージャでは、returnキーワードは不要です。
  3. pairパラメータ名は任意で無意味なので、暗黙的なクロージャパラメータを使用する方がよいでしょう。
  4. トレーディングクロージャ構文を使用できます。これらの変更後

、それはすべてがちょうどこのまで簡素化:

let result = collection.first{ $0.key.contains("mystring") } 
関連する問題