【发布时间】:2015-06-10 22:20:41
【问题描述】:
我有一个 UIView 的自定义子类。它有一个平移手势识别器,我已将其设置为必需的常量:
let dragger: UIPanGestureRecognizer
它是一个常量,因为它在视图初始化时创建一次,并在视图的生命周期内持续存在。
在视图的指定初始化程序init(coder) 中,我想创建我的平移手势识别器并将其连接起来。但是,在 Xcode 6.3 下,如果手势识别器是一个常数,我似乎不能这样做。 (这似乎只是 Xcode 6.3 beta 下的问题 代码允许我在调用 super.init(coder) 之后设置平移手势初始化器)
由于变量是必需的常量,所以在我调用超类init(coder)之前需要设置它。但是,平移手势识别器的唯一初始化程序将 self 作为参数。在我致电 super.init(coder) 之前,Self 不可用。
所以,我无法通过调用UIPanGestureRecognizer(target:action:)在调用super.init(coder) 来创建我的手势识别器,因为我需要将self 传递给那个平移手势初始化器,
...我不能在调用super.init(coder) 之后调用UIPanGestureRecognizer(target:action:) AFTER,因为我必须在调用超类初始化程序之前为所有必需的常量/变量设置值。
我能想出的唯一解决方案是让我的手势识别器成为一个可选的变量,我不想这样做。在初始化器完成后它总是有一个值,并且每次我使用它时都必须解开一个可选的值。
我错过了什么吗?
【问题讨论】:
-
我没有测试到最后,但是编译器在这样做的时候并没有抛出错误:let dragger = UIPanGestureRecognizer()
-
然后呢?调用
super.init(coder)后向手势识别器添加目标/动作?我想这会起作用,但手势识别器的文档说UIPanGestureRecognizer(target:action:)是指定的初始化程序,你应该调用指定的初始化程序。 -
有什么东西阻止你把它变成一个惰性计算的属性?
-
我可以让它变得懒惰,但我的目标是让它成为一个必需的常量。 lazy 仅适用于 var 属性。
-
@Thomas,您使用
UIPanGestureRecognizer()的简单初始化程序然后在调用超类初始化程序后添加目标/动作的解决方案是我发现的唯一一个可以让我将其保留为必需的解决方案常数(让)。发表您的建议作为答案,我会接受。
标签: swift object-initializers xcode6.3