Swift: значение по умолчанию для свойств в протоколе - PullRequest
1 голос
/ 18 апреля 2019

Я пытаюсь предоставить значение по умолчанию для переменной в протоколе.Я получаю сообщение об ошибке:

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 голосов
/ 18 апреля 2019
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

В дополнение к сохраненным свойствам, классам, структурам и перечисления могут определять вычисляемые свойства, которые на самом деле не сохранить значение. Вместо этого они предоставляют геттер и опциональный сеттер извлекать и устанавливать другие свойства и значения косвенно.

Вы не можете установить значение одной и той же переменной в самом сеттере.

...