在Swift Array

时间:2017-08-06 18:59:20

标签: swift

我需要快速找到数组中的对象。在我的代码中,我使用的是这种方法:

 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
}

有更好的方法吗?

2 个答案:

答案 0 :(得分:1)

所有数组都有first(where:)方法

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

答案 1 :(得分:0)

这是正确的方法

NO。您的实现很大程度上取决于contains的当前实现,它不保证它应用从第一个元素到最后一个元素的闭包。尽管当前实现不太可能完全改变,但在布尔闭包中产生副作用(所谓的谓词)可能很容易导致意外结果而不推荐。

Swift标准库有一种方法可以找到Array中的第一个元素,为什么不使用它?

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

使用first(where:)时,您的代码将是:

    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