nicksarno
nicksarno

Reputation: 4245

Swift: filter an array of Element1 [(String, Bool)] to return AND convert to an array of Element2 [String]?

I have an array of [(userID: String, friendBool: Bool)] that I want to filter AND convert to an array of userID's only [String] (removing the friendBool and therefore changing the element). Is there a function in Swift for doing this?

Currently, I am filtering on the array and then using a for loop on the filtered array [(userID: String, friendBool: Bool)] to convert it to an array of [String]. Is there a better way to do this?

Current Code:

    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)
    }

What I'm trying to do:

    //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)

Upvotes: 0

Views: 840

Answers (1)

Larme
Larme

Reputation: 26086

What about using compactMap()?

In a certain way, it can be understood as a filter() (that you are already using) + map() (which is the loop for existingFriend in newArray in the first solution)

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

In a shorter way:

let userArrayForTableView = friendArray.compactMap({ excludeUsers.contains($0.userID) ? nil : $0.userID })

Upvotes: 3

Related Questions