Swift:协议中属性的默认值

时间:2019-04-17 23:10:49

标签: swift protocols

我正在尝试为协议中的变量提供默认值。我收到一个错误:

Type ViewController does not conform to protocol Test

代码:

protocol Test {
    var aValue: CGFloat { get set }
}

extension Test {
    var aValue: CGFloat {
        return 0.3
    }
}


class ViewController: UIViewController, Test {

    override func viewDidLoad() {
       super.viewDidLoad()
       print("value \(aValue)")
    }
}

如何提供默认值,以便ViewController可以使用默认值(在协议扩展名中)而无需声明它?

1 个答案:

答案 0 :(得分:0)

protocol Test {
    var aValue: CGFloat { get set }
}

extension Test {
    var aValue: CGFloat {
        get {
            return 0.3
        }
        set {
            print("the new value is \(newValue)")
        }
    }
}

class Default: Test {
    init() {
        print("value \(aValue)")
    }
}


class ViewController: Test {

    var aValue: CGFloat {
        get {
            return 0.4
        }
        set {
            print("i am overriding the setter")
        }
    }

    init() {
        print("value \(aValue)")
    }
}

var d = Default() // value 0.3
d.aValue = 1 // the new value is 1.0

var vc = ViewController() // value 0.4
vc.aValue = 1 // i am overriding the setter

由于具有协议扩展,因此不需要,就不必实现getter或setter。

https://docs.swift.org/swift-book/LanguageGuide/Properties.html#//apple_ref/doc/uid/TP40014097-CH14-ID259

  

除了存储的属性,类,结构和   枚举可以定义计算属性,而实际上并不能   存储一个值。而是提供了一个getter和一个可选的setter   间接检索和设置其他属性和值。

您无法在设置器本身中设置相同变量的值。