结构默认初始化程序未触发 didSet

Posted

技术标签:

【中文标题】结构默认初始化程序未触发 didSet【英文标题】:struct default initialiser not triggering didSet 【发布时间】:2016-07-27 11:49:35 【问题描述】:

xcode 版本:7.3.1

大家好,

我正在关注最新的斯坦福大学 ios 课程。在其中一个正在创建的应用程序中,我们创建了一个具有许多属性的结构。

因为它是一个结构,所以我得到了一个免费的初始化程序,我在我的控制器中调用它。然后我将 struct 实例设为计算属性,以便调用 didSet。

这是结构

struct FacialExpression

var eyes: Eyes = Eyes.Open
var eyeBrows: EyeBrows = EyeBrows.Normal
var mouth: Mouth = Mouth.Smile

enum Eyes: Int 
    case Open
    case Closed
    case Squinting


enum EyeBrows: Int 
    case Relaxed
    case Normal
    case Furrowed

    func moreRelaxedBrow() -> EyeBrows 
        return EyeBrows(rawValue: rawValue - 1) ?? .Relaxed
    
    func moreFurrowedBrow() -> EyeBrows 
        return EyeBrows(rawValue: rawValue + 1 ) ?? .Furrowed
    


enum Mouth: Int 
    case Frown
    case Smirk
    case Neutral
    case Grin
    case Smile



这是创建结构实例的控制器

class FaceController: UIViewController 

var expression = FacialExpression(eyes: .Open, eyeBrows: .Normal, mouth: .Smile) 

    didSet 
        updateUI()
    



此控制器是应用程序中的默认且唯一的控制器,并且确实会调用 init 行。

didSet() 永远不会被调用。

谁能解释一下原因?

【问题讨论】:

【参考方案1】:

在初始化期间不会调用属性观察器。

看看this的问题。

【讨论】:

您好。谢谢您的回答。看起来你一针见血【参考方案2】:

你的 didSet 不知道要观察什么变量,所以正确的声明是

var expression = FacialExpression(eyes: .Open, eyeBrows: .Normal, mouth: .Smile) 

    didSet(expression) 
        updateUI()
    


【讨论】:

虽然 Viktors 的答案有效,但这是最好的答案,因为它确定了我做错了什么而不是解决它。

以上是关于结构默认初始化程序未触发 didSet的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI - 更改 @Published 结构时是不是可以触发 didSet?

属性观察器willSet与didSet

深入理解程序的结构

GCC 不优化未初始化的静态常量的结构副本

c语言怎么结构数据初始化?

未使用的默认成员初始化器如何改变 C++ 中的程序行为?