Setter 用于 Swift 中的 Bool

Setter for Bool in Swift

我正在使用自定义 getter,就像这样

var currentShowLiked: Bool {
    get {
        return [some condition met] ? true : false
    }
    set {
        self.currentShowLiked = newValue
    }
}

而且效果很好。但是,我希望能够将 truefalse 值设置回我的变量,但是 Swift 迫使我实施 setter,这不会产生任何警告,但在运行时,如果我要更改我的变量的值,应用程序会崩溃,没有明显的原因或指向 setter 行 EXC_BAD_ACCESS (code=2...) 的理智解释和控制台中的消息 warning: could not load any Objective-C class information. This will significantly reduce the quality of type information available.

我为什么要这样做?

您不能在其 setter 中设置值,因为您正在创建一个调用自身的递归方法,因为:

 self.currentShowLiked = newValue

将调用您定义的 set 方法,该方法将继续进行。如果您要覆盖 setter 和 getter,您可能想要一些私有的后备存储 属性。

此外,您还定义了一个基于某些条件的 getter,因此无论如何您都没有使用您在此 属性 上设置的值。我觉得你不需要这套

您上面的代码会崩溃,因为它会导致无限循环 - 您的 setter for currentShowLiked 将 currentShowLiked 设置为新值,然后再次调用 setter,依此类推。

您不必实施 setter,但您不使用 get - 语法如下:

   var currentShowLiked: Bool {
      return [some condition met]
   }

您处于递归上下文中。

您不能在 currentShowLiked 属性 正文中使用 currentShowLiked,如下所示:

// Recursive, Infinite loop
self.currentShowLiked = newValue

解决这个问题:

private var _currentShowLiked : Bool

var currentShowLiked: Bool {
    get {
        return [ some condition met on _currentShowLiked ] ? true : false
    }
    set {
        self._currentShowLiked = newValue
    }
}

这里的错误是误会造成的

当你声明一个

var a:Type

在对象内部分配一个成员值a,并自动创建访问器和修改器以允许您读取和写入该变量。

但是,当您声明

var a:Type { get { ... } set { ... } }

未分配任何成员值 - 您已指出当对象的用户访问(读取)或更改(写入)该值时,您的代码将执行所有必要的操作来响应它。如果您最终希望存储值,则需要将其存储为实际值(需要不同的名称)。

由于你是在对象的内部调用对象的修改器,你已经设置了一个无限循环,这导致你的程序因堆栈溢出而崩溃(所有的函数调用内存都是用来存放函数反复调用自己的记录。

定义自定义 getter 和/或 setter 操作的 Swift 属性 是 计算的 属性 实际上并不存储值。自定义setter可用于修改其他属性的内部状态。

另请参阅:“Swift 编程语言”第 180 页