在斯威夫特安装Bool

时间:2015-11-19 22:24:03

标签: swift setter

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

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

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

为什么我这样做?

5 个答案:

答案 0 :(得分:5)

你处于递归背景中。

你不能这样做:

    self.currentShowLiked = newValue // Recursive - StackOverflow error

解决此问题:

    private var _currentShowLiked : Bool

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

答案 1 :(得分:0)

您无法在其setter中设置值,因为您正在创建一个递归-method调用自身,因为:

 self.currentShowLiked = newValue

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

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

答案 2 :(得分:0)

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

你不必实现一个setter,但是你不能使用get - 语法是这样的:

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

答案 3 :(得分:0)

这里的错误是由误解造成的。

宣布

var a:Type

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

但是,当你声明

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

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

由于你正在调用对象的mutator中的对象的mutator,你已经设置了一个无限循环,这会导致程序因堆栈溢出而崩溃(所有函数调用内存都是用于存储一遍又一遍地调用自身函数的记录。

答案 4 :(得分:0)

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

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