2017-08-06 3 views
-2

アレイ内のオブジェクトをすばやく見つける必要があります。私のコードでは、私はこの方法を使用しています:Swift Arrayでオブジェクトをすばやく見つける

var marker_Detials: MarkerDetails? 

_ = self.markersArray.contains { (details: MarkerDetails) -> Bool in 
      if let location = location { 
      if location.id == details.marker?.id { 
       marker_Detials = details 
       return true 
      } 
      } 
      else if let marker = marker { 
      if marker == details.marker?.maker { 
       marker_Detials = details 
       return true 
      } 
      } 
      return false 
     } 
     return marker_Detials 
} 

は、より良い方法はありますか?

答えて

1

すべてのアレイがfirst(where:)方法

let marker_Detials = markersArray.first { details in 
    return (location != nil && location!.id == details.marker?.id) 
     || (marker != nil && marker == details.marker?.maker) 
} 
+0

あなたのコード内の条件は、それがOPに示すように、全く同じ結果を生成しないことがあまりにも単純化しています。たとえば、 'location'がnilの場合、' marker'がnilであると予想されない最初の 'details'を返します。 – OOPer

+0

@OOPer答えを更新しました。それを確認できますか? –

+0

私が見る限り、更新された条件はオリジナルと同等です。 – OOPer

0

を有するがNO

この正しい方法です。実装はcontainsの現在の実装に強く依存していますが、最初の要素から最後の要素へのクロージャの適用を保証するものではありません。現在の実装が完全に変更される可能性はほとんどありませんが、ブール型クロージャー(副述語)に副作用があると、予期しない結果が生じる可能性があり、推奨されません。

スウィフトスタンダードライブラリには、配列の最初の要素を見つける方法があります。なぜそれを使用しないのですか? first(where:)を使用して

public func first(where predicate: (Element) throws -> Bool) rethrows -> Element? 

、あなたのコードは次のようになります。

let marker_Detials = self.markersArray.first { (details: MarkerDetails) -> Bool in 
     if let location = location { 
      if location.id == details.marker?.id { 
       return true 
      } 
     } else if let marker = marker { 
      if marker == details.marker?.maker { 
       return true 
      } 
     } 
     return false 
    } 
    return marker_Detials 
関連する問題