如何将此函数转换为投掷函数?
How can I convert this function to a throwing function?
我正在努力提高我在 Swift 方面的技能,对于如何在下面的函数中使用 "throws" 的任何帮助,我将不胜感激。
我认为这是一种方便的用户抛出方式,这样我就可以向用户展示一个警报控制器,告诉他们出了什么问题:
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()
}
}
当你有一个带有回调的函数时,你不会抛出,那会把事情搞得一团糟。您将回调的参数更改为具有两种情况的枚举:错误和结果。这实际上是 Swift5 中的标准类型。
您传递的不是 User 传回完成处理程序,而是 Result。您几乎可以不用任何更改就可以使用它,因为 Result 有一个非常酷的初始化程序:
如果您 return 一个用户,调用者会得到一个 .success
,其中包含该用户。
如果抛出,调用者会得到一个 .failure
,其中包含抛出的错误。
而且,在远端,调用者可以向结果发送 get
消息,以类似的方式解包结果。
我正在努力提高我在 Swift 方面的技能,对于如何在下面的函数中使用 "throws" 的任何帮助,我将不胜感激。
我认为这是一种方便的用户抛出方式,这样我就可以向用户展示一个警报控制器,告诉他们出了什么问题:
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()
}
}
当你有一个带有回调的函数时,你不会抛出,那会把事情搞得一团糟。您将回调的参数更改为具有两种情况的枚举:错误和结果。这实际上是 Swift5 中的标准类型。
您传递的不是 User 传回完成处理程序,而是 Result。您几乎可以不用任何更改就可以使用它,因为 Result 有一个非常酷的初始化程序:
如果您 return 一个用户,调用者会得到一个
.success
,其中包含该用户。如果抛出,调用者会得到一个
.failure
,其中包含抛出的错误。
而且,在远端,调用者可以向结果发送 get
消息,以类似的方式解包结果。