簡體   English   中英

在數組中查找具有屬性的對象

[英]Find Object with Property in Array

是否有可能從具有特定屬性的數組中獲取對象? 或者我是否需要循環遍歷我的數組中的所有對象並檢查屬性是否是我正在尋找的特定屬性?

編輯:感謝您給我正確的方向,但我有一個問題轉換它。

//再次編輯:好的,如果只有一個特定的結果? 這也是一種可行的方法嗎?

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不是圖像的子類型 - 那么如果只有一個可能的結果呢?

您無法在編譯時證明陣列上只有一個可能的結果。 你真正要求的是第一個匹配的結果。 最簡單的(雖然不是最快)只是取過濾結果的第一個元素:

let imageObject = questionImageObjects.filter{ $0.imageUUID == imageUUID }.first

imageObject現在將是一個可選項,因為它可能沒有任何匹配。

如果搜索整個數組非常耗時,當然你可以輕松創建firstMatching函數,它將返回與閉包匹配的(可選)第一個元素,但對於短數組,這很簡單。


正如查爾斯所指出的,在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方法,你可以在其中設置邏輯表達式。

例:

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返回一個包含滿足邏輯表達式的所有項的數組。

庫參考”中的更多信息

這是Swift 4中的一個工作示例

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 firstMatchingPoint = points.first{$0.x == 1}

// Find all objects with given property
let allMatchingPoints = points.filter{$0.x == 1}

參考: 尾隨關閉

這是通過使用object屬性搜索數組中的對象來獲取特定對象的其他方法。

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 = ""
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM