【问题标题】:When to use delegate, inout or completion in Swift?何时在 Swift 中使用委托、输入输出或完成?
【发布时间】:2016-11-02 09:49:36
【问题描述】:

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

  • 完成块
  • 委托
  • 输入参数
  • 包装对象(只需将所有参数放在一个对象中)

我想知道是否有一些关于何时使用什么的好指南?具体来说,什么时候使用 inout 代替委托会是一种不好的做法?

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

所以现在我倾向于使用输入输出: 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)
}

这种方法与使用委托相比有一些缺点吗?

【问题讨论】:

  • 您可能还想将NotificationCenterKVOs 添加到选项列表中。
  • 确实它们也是选项,但我认为它们是特殊情况。 NotificationCenter 通常仅在您希望某些内容全球化时使用,而 KVO 通常用于与 UI 相关的内容。

标签: swift


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 我添加的具体例子呢?有没有采用这种方法的 cmets?
  • @Warpzit 为了处理错误,你不应该使用do...catch 来代替吗? developer.apple.com/library/content/documentation/Swift/…
  • Java 对我造成了极大的伤害:在 Java 中,我们仅在无法处理错误时才尝试抛出错误……但我想您是对的,还要非常感谢元组参考。我不知道 Swift 有元组。现在我只需要弄清楚如何处理它。
  • 我同意这里,尤其是元组的使用。当我附加到我的约束数组时,我也会使用 inout,因为它使我的代码更易于管理。点赞。
猜你喜欢
  • 1970-01-01
  • 2015-07-15
  • 1970-01-01
  • 2011-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多