什么()在Swift中意味着什么?
我在
Swift 3中有以下功能
func fetchOrders(_ completionHandler: (_ orders: [Order]) -> Void) { ordersStore.fetchOrders { (orders: () throws -> [Order]) -> Void in do { let orders = try orders() completionHandler(orders) } catch { completionHandler([]) } } } > fetchOrders中的_ completionHandler参数是什么意思? PS:我是iOS和Swift的新手
这里有很多,所以我们一次将其分解为一件:
func fetchOrders(_ completionHandler: (_ orders: [Order]) -> Void) >这是一个名为fetchOrders的函数. >该值是一个闭包,它接受[Order](Order数组)并返回Void.非正式地,这意味着“什么都不返回”,但字面意思是它返回空元组(). 现在我们将转向下一行: ordersStore.fetchOrders { (orders: () throws -> [Order]) -> Void in >这会调用ordersStore上的fetchOrders方法.我们可以从这段代码中看出fetchOrders采用了一个闭包参数.这在Swift中称为“尾随闭包”语法,这就是为什么我不会将_用于闭包.使用尾随闭包语法,不需要参数的外部名称. >我们已经传递了一个名为orders的闭包,它不接受任何操作并返回[Order]或抛出错误.基本上这是一种说fetchOrders可能会失败的方法. 这一切都引导我们: do { let orders = try orders() completionHandler(orders) } catch { completionHandler([]) } >这是评估订单关闭的地方. (这非常重要;如果订单有副作用,这就是它们发生的时间,它可能与预期的队列不同.这是我不喜欢这种模式的一个原因.)如果闭包成功,我们返回结果,否则我们在下面的回合中返回[]. >在这种特殊情况下,抛出方法略显愚蠢,因为它甚至在没有日志消息的情况下无声地扁平化为[].如果我们不关心错误,那么失败应该刚刚返回[]开始而不是抛出抛出.但是其他呼叫者可能会检查错误. >在任何一种情况下,我们都会使用我们的结果调用completionHandler闭包,将其链接回原始调用者. 这个do / catch块可以更简单地写成: let completedOrders = try? orders() ?? [] completionHandler(completedOrders) 这使得我们更清楚的是我们通过将错误变为可选来忽略错误,并避免调用completionHandler的代码重复. (我只是添加额外的let绑定以使代码更容易阅读;它不是必需的.) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |