【问题标题】:Swift: Default value for properties in ProtocolSwift:协议中属性的默认值
【发布时间】:2019-09-08 06:23:57
【问题描述】:

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

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 可以使用默认值(在协议扩展中)而不声明它?

【问题讨论】:

  • 扩展没有为协议声明中的值实现 set 方法 - 实现这个(或删除 set 功能)会解决问题吗?
  • 我希望能够设置值(覆盖默认值)。 set 会是什么样子?
  • 这取决于您希望默认 set 做什么。默认的 get 返回 0.3,所以默认的 set 应该覆盖它(在这种情况下,最好只使用变量实现)还是应该忽略它?
  • 是的,我希望该选项能够覆盖默认值。谢谢。
  • 然后参考这个答案以了解一些解决方法(stackoverflow.com/a/38885813/8903497)。您不能将属性存储在协议(或协议扩展)中,因此您必须找到另一种方法。

标签: swift protocols


【解决方案1】:
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 间接检索和设置其他属性和值。

你不能在 setter 本身中设置同一个变量的值。

【讨论】:

    猜你喜欢
    • 2016-12-17
    • 2022-01-02
    • 2020-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多