Тип "Any" не имеет элементов подписи после обновления до Swift 3
Вот мой код в Swift:
currentUserFirebaseReference.observeSingleEvent(of: .value, with: { (snapshot: FIRDataSnapshot) in
let UID = snapshot.key
let pictureURL = snapshot.value!["pictureURL"] as! String
let name = snapshot.value!["displayname"] as! String
let currentUser = Person(name: name, bio: "", UID: UID, pictureURL: pictureURL)
self.currentUserInfo = currentUser
})
Я просто обновился до Xcode 8/Swift 3, который, похоже, вызвал следующее сообщение об ошибке:
"Тип" Любой "не имеет элементов подстроки"
Я вызываю snapshot.value!["
вставить что-то здесь "]
во многие места в моем коде, я получаю эту ошибку, и я не могу запустить свой код.
Работает следующий код:
let pic = (snapshot.value as? NSDictionary)?["pictureURL"] as? String ?? ""
Тем не менее, я не вижу, что изменилось или что делает это необходимым сейчас против того, как это было раньше.
Единственное, что изменилось, насколько я знаю, это синтаксис наблюдения, но я не понимаю, почему это привело к тому, что мой код переставал работать.
Ответы
Ответ 1
В FIRDataSnapshot, value
имеет тип id
.
В Swift 3, id
импортируется как Any
.
В документации Firebase говорится, что value
может быть любым из NSDictionary
, NSArray
, NSNumber
или NSString
- очевидно, подписи не имеют смысла во всех этих случаях, особенно в Swift. Если вы знаете это как NSDictionary
в своем случае, тогда вы должны указать его на это.
Ответ 2
J. Ответ на Cocoe абсолютно прав, но для тех, кому нужен пример кода, вы это делаете:
вместо
let name = snapshot.value!["displayname"] as! String
попробовать
let snapshotValue = snapshot.value as? NSDictionary
let name = snapshotValue["displayName"] as? String
Идея состоит в том, что вам нужно передать тип snapshot.value из Any в NSDictionary.
Edit:
Как заметил Коннор, принудительное развертывание моментального снимка. Значение или что-либо из бэкэнд-системы - плохая идея из-за возможного получения неожиданной информации. Так что вы меняете! NSDictionary как? NSDictionary.