Search code examples
swiftstringdictionaryany

Swift - Remove key and values from dictionary [String : Any]


I am trying to removed block users from a dictionary [String : Any] that I am grabbing from the database. At first I grab the list of UID's that the current user has blocked:

var updatedBlockList: Any?
func findBlockUsers() {
    // find current users list of blocked users
    guard let currentUserUid = Auth.auth().currentUser?.uid else { return }

    let blockedUsers = Database.database().reference().child("users").child(currentUserUid)

    blockedUsers.observeSingleEvent(of: .value, with: { (snapshot) in
        guard let userIdsDictionary = snapshot.value as? [String: Any] else { return }
        userIdsDictionary.forEach({ (key, value) in
            guard let userDictionary = value as? [String: Any] else { return }

            var blockedList : Any
            blockedList = userDictionary.keys

            print(blockedList)

            self.updateBlockList(blockedList: blockedList)

        })
    })
}

func updateBlockList(blockedList: Any) {
    updatedBlockList = blockedList
    print(updatedBlockList)
}

If I print updatedBlockList I get: ["gdqzOXPWaiaTn93YMJBEv51UUUn1", "RPwVj59w8pRFLf55VZ6LGX6G2ek2", "xmigo8CPzhNLlXN4oTHMpGo7f213"]

I now want to take those UID's (which will be the key in UserIdsDictionary and remove them after I pull ALL the users:

fileprivate func fetchAllUserIds() {

    let ref = Database.database().reference().child("users")
        ref.observeSingleEvent(of: .value, with: { (snapshot) in
        guard let userIdsDictionary = snapshot.value as? [String: Any] else { return }

        userIdsDictionary.forEach({ (key, value) in

            // attempting to remove the blocked users here without any luck
            var updatedKey = key as String?
            updatedKey?.remove(at: self.updatedBlockList as! String.Index)
            print(updatedKey!)

            guard let  userDictionary = value as? [String: Any] else { return }

            let user = User(uid: key, dictionary: userDictionary)
            self.fetchPostsWithUser(user: user)
        })

    }) { (err) in
        print("Failed to fetch following user ids:", err)
    }

}

I get this error when trying to remove: Could not cast value of type 'Swift.Dictionary.Keys' (0x1de2f6b78) to 'Swift.String.Index'

I'm sure i'm going about this the wrong way, but I know i'm close. The end goal is to take the blocked users UID's and remove them from the dictionary. Any help would be very much appreciated!!


Solution

  • Your forEach loop on userIdsDictionary is the wrong approach here so rather than trying to fix that code I would use a different approach and loop over the updatedBlockList

    for item in updatedBlockList {
        if let userID = item as? String {
            userIdsDictionary.removeValue(forKey: userID)
        }
    }