【问题标题】:struct default initialiser not triggering didSet结构默认初始化程序未触发 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() 永远不会被调用。

谁能解释一下原因?

【问题讨论】:

    标签: ios swift xcode struct


    【解决方案1】:

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

    看看this的问题。

    【讨论】:

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

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

    var expression = FacialExpression(eyes: .Open, eyeBrows: .Normal, mouth: .Smile) {
    
        didSet(expression) {
            updateUI()
        }
    
    }
    

    【讨论】:

    • 虽然 Viktors 的答案有效,但这是最好的答案,因为它确定了我做错了什么而不是解决它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-16
    相关资源
    最近更新 更多