我如何将此函数转换为throwing函数?

问题描述 投票:0回答:2

我正在尝试在Swift中发展自己的技能,并且很高兴在下面的函数中提供有关如何“抛出”用户的帮助。

我认为这是一种方便的用户抛出方法,因此我可以向用户显示警报控制器,告诉他们出了什么问题:

    enum networkError: Error {
    case invalidURL
    case invalidUserinfo
    case invalidData
    case standard
    case nilProperty
}

func createUsers(completion: @escaping(User) -> ()) {

    REF_USER.observe(.childAdded) { (snapshot) in
        let uid = snapshot.key
        guard
            let dict = snapshot.value as? Dictionary<String,String>,
            let fullname = dict["fullname"],
            let profileImageUrl = dict["profileImageUrl"]
        else { return }

       guard let url = URL(string: profileImageUrl) else { return }

       URLSession.shared.dataTask(with: url) { (d, r, e) in
        if e != nil {
            print("DEBUG: Error fetching users profile image", e)
            return
        }
        guard let data = d else { return }
        guard let image = UIImage(data: data) else { return }

        let user = User(uid: uid, fullname: fullname, profileImage: image, isFollowed: false)
        completion(user)
       }.resume()
    }

}

swift firebase error-handling throw
2个回答
0
投票

[具有回调函数的函数不会抛出异常,这会使事情完全混乱。您将回调的参数更改为具有两种情况的枚举:错误和结果。这实际上是Swift5中的标准类型。


0
投票

而不是将用户传递回完成处理程序,而是传递结果。您几乎可以直接使用它,因为Result的初始化器非常酷:

  • 如果您返回一个用户,则呼叫者会得到一个.success,该用户包裹在其中。

  • 如果抛出,则调用者会得到一个.failure,其中包含抛出的错误。

并且,在远端,呼叫者可以将get消息发送给结果,从而以相似的方式解开结果。

© www.soinside.com 2019 - 2024. All rights reserved.