【问题标题】:swift: handling unwrapped optional in viewDidLoadswift:在 viewDidLoad 中处理未包装的可选
【发布时间】:2015-09-13 10:36:09
【问题描述】:

实际上,我在处理 UIViewController 上未包装的可选常量时遇到了一些麻烦。

因为 UI 组件仅在 viewDidLoad 调用后才存在,所以我似乎无法对需要 GUI 依赖的常量变量使用“let”常量修饰符。

这是一个例子:

class ViewController: UIViewController {

    @IBOutlet weak var blueSquare: UIView!
    var animator:UIDynamicAnimator!

    required init(coder aDecoder: NSCoder) {
        // If animator was constant, it should be initialized here.
        // But blueSquare is not initialized at this time, so I can't
        // call UIDynamicAnimator(referenceView:  blueSquare)
        super.init(coder: aDecoder)
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        // At this time, the initialisation is ok. But animator is now
        // actually modifiable
        self.animator = UIDynamicAnimator(referenceView:  blueSquare)
    }
}

如您所见,animator 的编写方式好像是可以修改的。意图不是。

我的问题是:有没有什么不错的模式可以让“动画师”保持不变?我没有找到任何处理 viewDidLoad 和带有 GUI 依赖范式的常量的文档。

【问题讨论】:

    标签: ios swift viewdidload let


    【解决方案1】:

    这就是为什么你应该利用选项。

    当您声明时:

    var animator:UIDynamicAnimator!
    

    您让编译器相信在调用 init(coder) 之前不必初始化 animator。你在这里玩的游戏很危险。相反,您更愿意使用:

    var animator:UIDynamicAnimator?
    

    所以在初始化之前使用 var 会报错。然后你可以在 viewDidLoad 中进行设置,事情就回到了应有的位置。

    您认为 blueSquare 只能在控制器生命周期的后期使用是正确的,这与 Swift 语法无关;这是一个框架约束。因此,您需要将 animator 声明为悬空引用,直到可以将其初始化为有用的东西。这就是 optional 为您提供的。

    【讨论】:

      猜你喜欢
      • 2015-12-03
      • 2017-05-24
      • 2017-03-26
      • 2015-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-27
      • 1970-01-01
      相关资源
      最近更新 更多