从 '(_) throws -> ()' 类型的抛出函数到非抛出函数类型 '(DataSnapshot) -> Void' 的无效转换
Posted
技术标签:
【中文标题】从 \'(_) throws -> ()\' 类型的抛出函数到非抛出函数类型 \'(DataSnapshot) -> Void\' 的无效转换【英文标题】:Invalid conversion from throwing function of type '(_) throws -> ()' to non-throwing function type '(DataSnapshot) -> Void'从 '(_) throws -> ()' 类型的抛出函数到非抛出函数类型 '(DataSnapshot) -> Void' 的无效转换 【发布时间】:2017-06-06 03:17:05 【问题描述】:我有以下错误:
'(_) throws -> ()' 类型的抛出函数的无效转换 到非抛出函数类型 '(DataSnapshot) -> Void'
func getUserList() throws
var ref: DatabaseReference!
ref = Database.database().reference()
ref.child("User").observeSingleEvent(of: .value, with: (snapshot) in
let value = snapshot.value as? NSDictionary
let keys = value?.allKeys
for key in keys!
let dict = value?[key] as? NSDictionary
let user = User.init(name: dict?["Name"] as? String ?? "", selected: dict?["Selected"] as? String ?? "")
let viewUser = ViewUser.init(user: user)
self.data.append(viewUser)
debugPrint(user ?? "")
self.tableView.reloadData()
if value?.count == 0
throw UserError.Empty
)
【问题讨论】:
【参考方案1】:您在完成块中抛出错误。这是不可能的,并且会导致错误。
闭包的返回值与封闭函数的返回值无关——严格来说throws
不是返回值,但也会受到影响。
为了能够从闭包中返回一些东西,你必须实现一个完成块而不是throws
func getUserList(completion : (Error?) -> ())
并使用它
completion(value.isEmpty ? UserError.Empty : nil)
旁注:您使用了太多的问号和感叹号。例如,使用可选绑定来解包可选(并使用 Swift 原生集合类型)
if let value = snapshot.value as? [String:Any]
for key in value.keys ...
【讨论】:
以上是关于从 '(_) throws -> ()' 类型的抛出函数到非抛出函数类型 '(DataSnapshot) -> Void' 的无效转换的主要内容,如果未能解决你的问题,请参考以下文章
从 '(_) throws -> ()' 类型的抛出函数到非抛出函数类型 '(DataSnapshot) -> Void' 的无效转换
从 '(_) throws -> Void' 类型的抛出函数到非抛出函数类型 '([UNNotificationRequest]) -> Void 的无效转换
Alamofire 4从“(_) throws ->()”类型的抛出函数到非抛出函数类型“(DataResponse <Any>)-> Void”的无效转换
无法使用类型为“(NSMutableURLRequest,(_,_,_) throws -> _)”的参数列表调用“dataTaskWithRequest”