Контекстный тип 'Void' нельзя использовать с литералом словаря - PullRequest
0 голосов
/ 05 ноября 2018

Эта ошибка появляется после того, как я перезапустил свой Проект без каких-либо изменений, никогда не слышал об этом раньше.

func toDictionary() -> [String : Any] {

    let newPostRef = Database.database().reference().child("posts").childByAutoId()
    let newPostKey = newPostRef.key

    // 1. save image
    if let imageData = image.jpegData(compressionQuality: 0.5) {
        let storage = Storage.storage().reference().child("images/\(newPostKey)")

        storage.putData(imageData).observe(.success, handler: { (snapshot) in
            self.downloadURL = snapshot.metadata?.downloadURL()?.absoluteString

        return [ <- The Error appears here!!!
        "text" : text,
        "imageDownloadURL" : downloadURL,
        "numberOfLikes" : numberOfLikes,
        "numberOfDislikes" : numberOfDislikes
    ]
        }
    )}
}

Может быть, помогут следующие строки кода, так как я читаю только то, что эта ошибка возникает из-за какой-либо ложной строки или чего-то в этом роде ...

var text: String = ""
private var image: UIImage!
var downloadURL: String?
var numberOfLikes = 0
var numberOfDislikes = 0
let ref: DatabaseReference!

init(snapshot: DataSnapshot){
    ref = snapshot.ref
    if let value = snapshot.value as? [String : Any] {
        text = value["text"] as! String
        downloadURL = value["imageDownloadURL"] as? String
        numberOfLikes = value["numberOfLikes"] as! Int
        numberOfDislikes = value["numberOfDislikes"] as! Int
    }
}

1 Ответ

0 голосов
/ 05 ноября 2018

Проблема в том, что функция Firebase observe является асинхронной, поэтому вы не можете использовать синхронный оператор return для возврата значений из него. Вам необходимо объявить вашу функцию для использования обработчика завершения.

func toDictionary(completion: @escaping ([String:Any])->()) {

    let newPostRef = Database.database().reference().child("posts").childByAutoId()
    let newPostKey = newPostRef.key

    // 1. save image
    if let imageData = image.jpegData(compressionQuality: 0.5) {
        let storage = Storage.storage().reference().child("images/\(newPostKey)")

        storage.putData(imageData).observe(.success, handler: { (snapshot) in
            self.downloadURL = snapshot.metadata?.downloadURL()?.absoluteString
            let snapShotDict = ["text" : text, "imageDownloadURL" : downloadURL, "numberOfLikes" : numberOfLikes, "numberOfDislikes" : numberOfDislikes ]
            completion(snapShotDict)
        }
    )}
}

Тогда получите к нему доступ вот так:

toDictionary(completion: { dict in
    // You can only use `dict` inside the completion handler closure
    print(dict)
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...