我实际上在UIViewController上处理unwrapped可选常量时遇到了一些麻烦。
因为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依赖范例常量的文档。
答案 0 :(得分:0)
这就是为什么你应该利用选项。
宣布:
var animator:UIDynamicAnimator!
您使编译器相信动画师在调用init(编码器)之前不必进行初始化。这是你在这里玩的危险游戏。相反,你更愿意使用:
var animator:UIDynamicAnimator?
因此在初始化之前使用var会报告为错误。然后你可以在viewDidLoad中设置它,然后事情就会回到原来的位置。
你认为blueSquare只能在控制器的生命周期中使用,这是正确的,这与Swift语法无关;这是一个框架约束。因此,您需要将animator声明为悬挂参考,直到它可以被用于有用的东西。这是可选项为您提供的内容。