在数组中查找带有属性的对象
是否有可能从一个具有特定属性的数组中获取对象? 或者我需要循环槽中的所有对象,并检查是否属性是我正在寻找?
编辑:谢谢你给我正确的方向,但我有一个问题,将其转换。
//再次编辑:一个好的,如果只有一个特定的结果? 这也是一个可行的方法吗?
let imageUUID = sender.imageUUID let questionImageObjects = self.formImages[currentSelectedQuestion.qIndex] as [Images]! // this is working //var imageObject:Images! /* for (index, image) in enumerate(questionImageObjects) { if(image.imageUUID == imageUUID) { imageObject = image } } */ // this is not working - NSArray is not a subtype of Images- so what if there is only 1 possible result? var imageObject = questionImageObjects.filter( { return $0.imageUUID == imageUUID } )
//这是不行的 – NSArray不是图像的子types,那么如果只有1个可能的结果呢?
在编译时你没有办法certificate数组只有一个可能的结果。 你真正要求的是第一个匹配的结果。 最简单的(尽pipe不是最快的)就是取第一个过滤结果的元素:
let imageObject = questionImageObjects.filter{ $0.imageUUID == imageUUID }.first
imageObject
现在将成为一个可选项,因为可能没有任何匹配。
如果search整个数组是耗时的,当然你可以很容易地创build一个firstMatching
函数,它将返回匹配闭包的(可选的)第一个元素,但是对于短数组来说,这很好,很简单。
正如charles所指出的,在Swift 3中,这个内置于:
questionImageObjects.first(where: { $0.imageUUID == imageUUID })
编辑2016-05-05: Swift 3将包括first(where:)
。
在Swift 2中,可以使用indexOf
来查找与谓词相匹配的第一个数组元素的索引。
let index = questionImageObjects.indexOf({$0.imageUUID == imageUUID})
这比filter
快一点,因为它会在第一场比赛后停止。 (或者,你可以使用一个lazy
序列。)
然而,你只能得到索引而不是对象本身有点烦人。 为了方便起见,我使用以下扩展名:
extension CollectionType { func find(@noescape predicate: (Self.Generator.Element) throws -> Bool) rethrows -> Self.Generator.Element? { return try indexOf(predicate).map({self[$0]}) } }
接下来的作品:
questionImageObjects.find({$0.imageUUID == imageUUID})
是的,你可以使用filter
方法,它可以设置你的逻辑expression式。
例:
struct User { var firstName: String? var lastName: String? } let users = [User(firstName: "John", lastName: "Doe"), User(firstName: "Bill", lastName: "Clinton"), User(firstName: "John", lastName: "Travolta")]; let johns = users.filter( { return $0.firstName == "John" } )
请注意, filter
返回一个包含满足逻辑expression式的所有项的数组。
更多信息在图书馆参考
这是另一种通过使用对象属性来search数组中的对象来获取特定对象的方法。
if arrayTicketsListing.contains({ $0.status_id == "2" }) { let ticketStatusObj: TicketsStatusList = arrayTicketsListing[arrayTicketsListing.indexOf({ $0.status_id == "2" })!] print(ticketStatusObj.status_name) }
而我的arrayTicketsListing是[TicketsStatusList]
包含TicketsStatusList
类的对象。
// TicketsStatusList class class TicketsStatusList { internal var status_id: String internal var status_name: String init(){ status_id = "" status_name = "" } }
这是Swift 3中的一个实例
class Point{ var x:Int var y:Int init(x:Int, y:Int){ self.x = x self.y = y } } var p1 = Point(x:1, y:2) var p2 = Point(x:2, y:3) var p3 = Point(x:1, y:4) var points = [p1, p2, p3] // Find the first object with given property let firstPoint = points.first{$0.x == 1} // Find all objects with given property let matchingPoints = points.filter{$0.x == 1}
参考: 尾随closures