在数组中查找带有属性的对象

是否有可能从一个具有特定属性的数组中获取对象? 或者我需要循环槽中的所有对象,并检查是否属性是我正在寻找?

编辑:谢谢你给我正确的方向,但我有一个问题,将其转换。

//再次编辑:一个好的,如果只有一个特定的结果? 这也是一个可行的方法吗?

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