Перебирайте массив словаря и отделяйте имя для статуса true - PullRequest
0 голосов
/ 02 октября 2018

Я хочу перебрать этот массив и выделить имена, которые имеют статус true.

var array = [["name":"joe", "status":false ],["name":"will", "status":false],["name":"smith" , "status":false]]

Ответы [ 2 ]

0 голосов
/ 02 октября 2018

Вы можете использовать простой filter, если хотите сохранить статус и имя, в противном случае используйте compactMap, если вы просто хотите сохранить имя.

let statuses = [["name":"joe", "status":true ],["name":"will", "status":false],["name":"smith" , "status":false]]
let trueStatuses = statuses.filter({$0["status"] as? Bool == true}) // [["name": "joe", "status": true]]
let namesWithTrueStatus = statuses.compactMap{$0["status"] as? Bool == true ? $0["name"] as? String : nil} //["joe"]
0 голосов
/ 02 октября 2018

Это должно сработать.

var array = [["name":"joe", "status":true ],["name":"will", "status":true],["name":"smith" , "status":false]]

let filteredDictionary = array.filter( { $0["status"] as? Bool ?? false } )

var names = [String]()

for dictionary in filteredDictionary {
    if let nameFound = dictionary["name"] as? String {
        names.append(nameFound)
    }
}

Я рекомендую использовать struct для хранения значений вместо словаря.Примерно так.

struct Person {
    var name: String
    var status: Bool
}

Если у вас есть это в массиве Person, это становится менее сложным, так как можно избежать необязательной обработки значения словаря.

var personArray = [Person(name: "joe", status: true), Person(name: "will", status: false)
let names = personArray.filter( {$0.status} ).map( {$0.name} )
...