Swift: отфильтровать массив Element1 [(String, Bool)], чтобы вернуть И преобразовать в массив Element2 [String]? - PullRequest
0 голосов
/ 25 февраля 2020

У меня есть массив [(userID: String, friendBool: Bool)], который я хочу отфильтровать и преобразовать в массив только userID [String] (удаляя friendBool и, следовательно, изменяя элемент). Есть ли в Swift функция для этого?

В настоящее время я фильтрую массив, а затем использую для l oop для фильтруемого массива [(userID: String, friendBool: Bool)], чтобы преобразовать его в массив [String]. Есть ли лучший способ сделать это?

Текущий код:

    let friendArray = [(userID: String, friendBool: Bool)]()
    let excludeUsers = [String]()

    //Updates with user actions
    var userArrayForTableView = [String]()

    //Filter friendArray
    let newArray = friendArray.filter { (existingFriend) -> Bool in
        return !excludeUsers.contains(existingFriend.userID)
    }

    //Convert array fro [(userID: String, friendBool: Bool)] to [String]
    for existingFriend in newArray {
        userArrayForTableView.append(existingFriend.userID)
    }

Что я пытаюсь сделать:

    //Loaded on ViewDidLoad
    let friendArray = [(userID: String, friendBool: Bool)]()
    let excludeUsers = [String]()

    //Updates with user actions
    var userArrayForTableView = [String]()

    //Filter friendArray
    /*
    Below fitler returns an array of [(userID: String, friendBool: Bool)]...
     but I want a filter to return an array of [String] for just userIDs
    */
    let newArray = friendArray.filter { (existingFriend) -> Bool in
        return !excludeUsers.contains(existingFriend.userID)
    }
    //ERROR HERE because 'newArray' is not [String]
    userArrayForTableView.append(contentsOf: newArray)

1 Ответ

3 голосов
/ 25 февраля 2020

Как насчет использования compactMap()?

В определенном смысле это можно понимать как filter() (который вы уже используете) + map() (то есть l oop for existingFriend in newArray в первом решении)

let userArrayForTableView = friendArray.compactMap({ (existingFriend) in 
    if excludeUsers.contains($0.userID) {
        return nil
    } else {
        return existingFriend.id
    }
})

Короче:

let userArrayForTableView = friendArray.compactMap({ excludeUsers.contains($0.userID) ? nil : $0.userID })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...