在Swift中何时使用委托、输入或完成?

在Swift中何时使用委托、输入或完成?,swift,Swift,当我们调用一些代码并需要具有多个参数的响应时,我们在Swift中有多个选项: 完井区块 委派 输入输出参数 包装器对象(只需将所有参数放入对象中) 我想知道是否有一些很好的指导方针来指导何时使用什么?具体来说,什么时候使用inout而不是delegate会是一种糟糕的做法 具体来说: 还有一个例子可以用来解释: 我有一个与B类通信的类A。类A需要一个数据列表和一个可选错误 所以现在我倾向于使用inout: A类: 与使用代理相比,这种方法是否存在一些缺点 我将解释何时应使用每种方法 当操作需

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

  • 完井区块
  • 委派
  • 输入输出参数
  • 包装器对象(只需将所有参数放入对象中)
我想知道是否有一些很好的指导方针来指导何时使用什么?具体来说,什么时候使用inout而不是delegate会是一种糟糕的做法

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

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


与使用代理相比,这种方法是否存在一些缺点

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

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

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

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


根据我自己的经验,swift中很少使用包装器对象。那是因为我们有元组!您可以将所有内容都封装在一个元组中并传递。我通常不会创建一个新的结构或类来包装一些参数。但是,如果您的数据结构变得复杂,例如
[(String[String:(String,Int)]]
,请务必使用它们。我将解释何时应该使用每种方法

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

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

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


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

您可能还想将和添加到选项列表中,请务必使用它们。确实,它们也是选项,但我将它们视为特殊情况。NotificationCenter通常仅在您希望某些内容全局化时使用,而KVO通常用于与UI相关的内容。您可能还希望将和添加到选项列表中。诚然,它们也是选项,但我将它们视为特殊情况。NotificationCenter通常仅在您希望某些内容全球化时使用,而KVO通常用于与UI相关的内容。我添加的具体示例如何?对该方法有何评论?@Warpzit用于处理错误,您是否应该使用
do…catch
?我被Java给毁了:在Java中,只有当我们无法处理错误时,我们才会尝试抛出错误。。。但是我想你是对的,也非常感谢元组参考。我不知道斯威夫特有元组。现在我只需要找出如何处理它,我同意这一点,特别是元组的用法。我在附加到约束数组时也使用inout,因为它使代码更易于管理。向上投票。我添加的具体示例如何?对该方法有何评论?@Warpzit用于处理错误,您是否应该使用
do…catch
?我被Java给毁了:在Java中,只有当我们无法处理错误时,我们才会尝试抛出错误。。。但是我想你是对的,也非常感谢元组参考。我不知道斯威夫特有元组。现在我只需要找出如何处理它,我同意这一点,特别是元组的用法。我在附加到约束数组时也使用inout,因为它使代码更易于管理。向上投票。
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)
}