快速查找Swift数组中的对象

快速查找Swift数组中的对象,swift,Swift,我需要在数组中快速找到一个对象。在我的代码中,我使用以下方法: var marker_Detials: MarkerDetails? _ = self.markersArray.contains { (details: MarkerDetails) -> Bool in if let location = location { if location.id == details.marker?.id { mark

我需要在数组中快速找到一个对象。在我的代码中,我使用以下方法:

 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
}
有更好的方法吗?

所有数组都有这种方法

这是正确的方法吗

否。您的实现强烈依赖于
包含的当前实现,这并不保证它从第一个元素到最后一个元素应用闭包。即使当前的实现不太可能完全改变,但是在布尔闭包(所谓的谓词)中产生副作用可能很容易导致意外结果,因此不推荐使用

Swift标准库有一种查找数组中第一个元素的方法,为什么不使用它呢

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

代码中的条件过于简化,因此无法生成与OP中所示完全相同的结果。例如,如果
location
为nil,它可能会返回第一个
details
,其中它的
标记
为nil,这是不可能的。@OOPer我更新了我的答案。你能检查一下吗?据我所知,更新后的条件与原来的是一样的。谢谢漂亮的小代码和完美的工作!!!!!
    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