何时在Swift中使用delegate,inout或completion?

时间:2016-11-02 09:49:37

标签: swift

当我们调用某些代码并需要具有多个参数的响应时,我们在Swift中有多个选项:

  • 完成块
  • 代表
  • Inout parameters
  • 包装器对象(简单地将所有参数放在对象中)

我想知道在什么时候使用什么有一些好的指导方针?特别是什么时候使用inout代替委托是不好的做法?

非常具体: 还有一个可用于解释的示例: 我有A类与B类通信.A类需要一个数据列表和一个可选错误。

所以现在我倾向于使用inouts: A类:

var error = ServiceError()
let wordSuggestions = B.parseSuggestionResponse(json: result as! NSDictionary, error: &error)

if error.type == .none {
    // Success, now use wordSuggestions for something!
} else {
    self.handleError(error: error)
}

这种方法与使用委托相比有什么不利之处吗?

1 个答案:

答案 0 :(得分:2)

我将解释何时应该使用每种方法。

操作需要时间时使用完成块。例如,UIView.animate具有完成块参数,因为动画视图需要时间。

仅当某些对象存在时才使用委托,尤其是当该对象可以具有多个状态时。这被广泛用于视图和控制器之间的通信当只有一种方法时,代表不会工作。例如,GADInterstitial有一个委托,因为它可以有不同的状态,例如用户解雇广告,用户点击广告并离开应用,广告已加载等。

Inout参数主要用于传递值类型作为引用。我无法在iOS SDK中找到任何此用法,因为Objective-C中没有输入。最接近它的是UnsafeMutablePointer<T>。基本上,如果你想创建一个带有一堆值类型参数并且你想要改变它们的值的方法,那就使用inout!有关详细信息,请参阅this page

根据我自己的经验,swift中很少使用包装器对象。那是因为我们有元组!你可以将所有内容都包含在一个元组中并传递它。我通常不会创建一个新的结构或类来包装一些参数。但是,如果您的数据结构变得像[(String, [String: (String, Int)])]那样复杂,那么就会使用它们。