Swift:协议中属性的默认值

use*_*173 2 protocols swift

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

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)")
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Huy*_*ang 7

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
Run Code Online (Sandbox Code Playgroud)

由于您有一个协议扩展,如果您不想,您不必实现 getter 和 setter。

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

除了存储的属性之外,类、结构和枚举还可以定义计算属性,这些属性实际上并不存储值。相反,它们提供了一个 getter 和一个可选的 setter 来间接检索和设置其他属性和值。

您不能在 setter 本身中设置相同变量的值。