【问题标题】:Call a method once only for the lifetime of the object in Swift在 Swift 中,仅在对象的生命周期内调用一次方法
【发布时间】:2016-08-20 05:40:34
【问题描述】:

假设我们重写了scrollViewDidScroll 方法,并且对于第一次滚动,我们想要doSomething()

实现这一点的一种简单方法是拥有一个实例级布尔变量并切换/检查它。

func scrollViewDidScroll(scrollView: UIScrollView!) {
  if(!scrolled) {
   scrolled = true; 
   doSomething(); 
  }
}

我想要一个不引入布尔变量scrolled 的更好的解决方案。类似于dispatch_once 的东西,但针对对象的生命周期而不是整个过程。

这个模式有名字吗?

【问题讨论】:

  • 为什么会被否决?这是一个明确的问题,提出了一个有效的问题。

标签: ios swift cocoa-touch


【解决方案1】:

类似于 dispatch_once 的东西,但在对象的生命周期而不是整个过程中

不幸的是,dispatch_once 在实例级别并不安全。在 Objective-C 中使用它的人这样做是错误的。这就是 dispatch_once 在 Swift 中不可用的原因。

您的 if !scrolled 模式实际上是正确的实现(除了您使用括号、分号和其他非 Swifty 的东西)。它被称为标志

【讨论】:

  • 谢谢。我实际上是在试图避免其他人在类的其他区域重新利用布尔值的问题,从而弄乱我的实现。例如。假设我正在尝试对此进行分析-其他人可能正在做与隐藏的标题视图或其他相关的事情-并且正在重用布尔值。问题会很晚才出现。最好的方法是完全避免布尔值,对吧?
  • @zakishaheen:另请参阅 Apple 工程师 Greg Parker 的回答 stackoverflow.com/a/19845164/1187415
  • 还有一些有趣的讨论在这里github.com/apple/swift-corelibs-libdispatch/pull/…
【解决方案2】:

由于您希望类的每个实例只完成一次,因此使用实例变量是正确的解决方案。而且,正如您所说,这是一种简单的方法。

如果它是正确且微不足道的,为什么你认为有更好的方法?

【讨论】:

  • 我认为它增加了对象的“状态”。我试图避免它。我不希望其他人试图将布尔变量重新用于其他问题,从而为我的解决方案带来问题。
  • 1) 跟踪对象的状态正是实例变量的用途。 2)你在说谁?将其设为私有实例变量(或私有属性),其他人将无法“重新利用”该变量。
  • 我指的是另一个开发人员稍后在同一类上工作。
  • 这就是 cmets 的用途。这就是为什么变量应该具有良好的描述性名称的原因。由于其他开发人员错误地滥用了您的实例变量,您已经花费了更多的时间来尝试为一个微不足道的问题找到一些神秘、复杂得多的解决方案。
猜你喜欢
  • 2012-04-14
  • 1970-01-01
  • 2020-09-19
  • 1970-01-01
  • 1970-01-01
  • 2019-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多