从 '(_) 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”

133.throw机制 抛出类类型

蓝桥杯_left and throw