Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift中属性方法(set、get、didSet、willSet等)的继承_Swift_Inheritance_Properties_Getter Setter - Fatal编程技术网

Swift中属性方法(set、get、didSet、willSet等)的继承

Swift中属性方法(set、get、didSet、willSet等)的继承,swift,inheritance,properties,getter-setter,Swift,Inheritance,Properties,Getter Setter,我的问题是如何处理诸如set、get、didSet、willSet等属性方法的继承 让我们举一个例子:我想重写Swift类中属性的setter方法。以下是我想要实现的目标,但显然不起作用: class A { var value: Int {get {...} set {...} } } class B: A { var value: Int { set(newValue) { // do some fancy stuff...

我的问题是如何处理诸如set、get、didSet、willSet等属性方法的继承

让我们举一个例子:我想重写Swift类中属性的setter方法。以下是我想要实现的目标,但显然不起作用:

class A {
    var value: Int {get {...} set {...} }
}

class B: A {
    var value: Int {
        set(newValue) {
            // do some fancy stuff...
        }
    }
}
这也不起作用:

// in class B
override func setValue(newValue: Int) {
    // do some fancy stuff...
}
我们可以在Swift中执行以下操作:

class A {
    var _value: Int = 0
    var value: Int {
        get {
            return _value
        }
        set {
            _value = newValue
        }
    }
}

class B: A {
    override var value: Int {
        get {
            return _value
        }
        set {
            _value = newValue + 1
        }
    }
}

let a = A()
a.value = 1
print(a.value) // => 1

let b = B()
b.value = 1 
print(b.value) // => 2

这种方法不是很优雅,因为我还必须实现getter方法,这实际上是不必要的,因为只有setter应该被重写

不幸的是,如果您真的想这样做,那么唯一的方法就是创建一个单独的get-and-set方法

class A {
  private var value: Int = 0

 func getValue() -> Int { return value }
 func setValue(newValue : Int) {
   value = newValue
 }
}
根据使用计算属性的性质,在某些方面,您基本上是在创建两个独立方法的基础上创建了一个快捷方式,因此,如果您想更改内容,您必须同时重写set和get。

您可以:

class A {
    var value: Int = 0
}

class B: A {
    override var value: Int {
        get { return super.value }
        set {
            // Something fancy...
            super.value = newValue
        }
    }
}

虽然您仍然需要在B中实现getter,但至少不需要_值,这有助于保持类a的干净。

根据您的使用情况,对didSet的重写可以实现基于上一个示例的技巧:

class B: A {
    override var value: Int {
        didSet {
            _value++
        }
    }
}

在您的第一个示例中,存储了baseclasses属性,而计算了子类1,它们必须是相同的类型才能执行任何重写操作。您是对的,这只是因为为了显示目标。@Kametrixom虽然您确实不能用存储的属性重写计算属性,但另一种方法是可能的。这使它更干净,但底层问题是:如何继承与属性相关的方法,例如get、set、willSet、…@MichaelDorner:我可能错了,但是超类中的var-value:Int=0是一个存储的属性,所以除非用@objc标记它,否则它没有可以继承的set/get方法。没错,这只是为了演示。第二个代码是带有计算属性的。但我删除了它以避免误解。如果子类的值字符串、Int等的类型不同怎么办。。。但是您希望能够根据它们从公共超类继承的事实来设置/获取值吗?