快速查找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