gpt4 book ai didi

ios - 在 Swift 1.2 中将 self 作为参数传递给 init 方法

转载 作者:IT王子 更新时间:2023-10-29 05:40:38 26 4
gpt4 key购买 nike

以下类有一个“let”属性声明为隐式解包变量。这以前适用于 Xcode 6.2:

class SubView: UIView {

let pandGestureRecognizer: UIPanGestureRecognizer!

required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
self.pandGestureRecognizer = UIPanGestureRecognizer(target: self, action: "panAction:")
}

func panAction(gesture: UIPanGestureRecognizer) {
// ...
}
}

升级到Xcode 6.3(带Swift 1.2)后,出现如下编译错误:

Property 'self.panGestureRecognizer' not initialized at super.init call
Immutable value 'self.panGestureRecognizer' may only be initialized once

super.init 调用之前移动以下行:

self.pandGestureRecognizer = UIPanGestureRecognizer(target: self, action: "panAction:")

出现以下错误:

'self' is used before super.init call

属性“panGestureRecognizer”不需要更改,因此必须将其声明为常量“let”。因为它是一个常量,所以它必须在声明时有一个初始值,或者在 init 方法中初始化它。要对其进行初始化,需要在“target”参数中传递“self”。

其他线程建议将其声明为隐式解包可选,并在 super.init 调用后对其进行初始化。这在我更新到 Xcode 6.3 之前一直有效。

有人知道这种情况的正确实现或解决方法吗?

最佳答案

问题

问题是您对 let 的使用 - 声明为 let 的可选项未被赋予默认值 nil (var 是)。以下内容在 Swift 1.2 中引入,否则将无效,因为您将无法在声明后为 myOptional 提供一个值:

let myOptional: Int?

if myCondition {
myOptional = 1
} else {
myOptional = nil
}

因此,您会收到错误消息“Property 'self.panGestureRecognizer' not initialized at super.init call' 因为在调用 super.init(coder: aDecoder) 之前,因为 panGestureRecognizer 不是 nil;它根本没有被初始化。

解决方案:

1.panGestureRecognizer 声明为var,这意味着它将被赋予默认值nil,然后您可以在调用 super.init(coder: aDecoder) 后更改它。

2. 在我看来,更好的解决方案是:不要使用隐式展开的可选项并声明 panGestureRecognizer 的初始值为 UIPanGestureRecognizer()。然后在 super.init 调用后设置目标:

class SubView: UIView {
let panGestureRecognizer = UIPanGestureRecognizer()

required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)

panGestureRecognizer.addTarget(self, action: Selector("panAction:"))
}
}

关于ios - 在 Swift 1.2 中将 self 作为参数传递给 init 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29631800/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com