Swift - удаление ключа и значений из словаря [String: Any] - PullRequest
0 голосов
/ 27 октября 2019

Я пытаюсь удалить заблокированных пользователей из словаря [String: Any], который я извлекаю из базы данных. На первый хватаю список UID о том, что текущий пользователь заблокирован:

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

Если я печатаю updatedBlockList я получаю: [ "gdqzOXPWaiaTn93YMJBEv51UUUn1", "RPwVj59w8pRFLf55VZ6LGX6G2ek2", "xmigo8CPzhNLlXN4oTHMpGo7f213"]

1005 *Теперь я хочу взять эти UID (которые будут ключом в UserIdsDictionary и удалить их после того, как я потяну ВСЕХ пользователей:
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)
    }

}

Я получаю эту ошибку при попытке удалить: Не удалось привести значение типа 'Swift.Dictionary.Keys '(0x1de2f6b78) на' Swift.String.Index '

Я уверен, что я поступаю неправильно, но я знаю, что я близок. Конечная цель состоит в том, чтобывозьмите UID заблокированных пользователей и удалите их из словаря. Любая помощь будет очень признательна !!

Ответы [ 2 ]

0 голосов
/ 28 октября 2019

Для всех, кто интересуется, вот последние изменения, которые были сделаны, чтобы заставить его работать.

var updatedBlockList = [String]()

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 }

            let blockedList = Array(userDictionary.keys)

            print(blockedList)

            self.updateBlockList(blockedList: blockedList)

        })
    })
}

func updateBlockList(blockedList: [String]) {
    updatedBlockList = blockedList
    print(updatedBlockList)
}

fileprivate func fetchAllUserIds() {

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

        for item in self.updatedBlockList {
            userIdsDictionary.removeValue(forKey: item)
        }

        userIdsDictionary.forEach({ (key, value) in

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

}
0 голосов
/ 27 октября 2019

Ваш цикл forEach на userIdsDictionary является неправильным подходом, поэтому вместо того, чтобы пытаться исправить этот код, я бы использовал другой подход и зацикливался на updatedBlockList

for item in updatedBlockList {
    if let userID = item as? String {
        userIdsDictionary.removeValue(forKey: userID)
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...