iOS lazy var UIBarButtonItem目标问题
我在使用惰性var初始化时无意中发现了这个uibarbuttonite目标问题iOS lazy var UIBarButtonItem目标问题,ios,swift,uibarbuttonitem,lazy-evaluation,target,Ios,Swift,Uibarbuttonitem,Lazy Evaluation,Target,我在使用惰性var初始化时无意中发现了这个uibarbuttonite目标问题 class ViewController: UIViewController { lazy var barButtonItem1 = UIBarButtonItem(barButtonSystemItem: .cancel, target: self, action: #selector(action1)) lazy var barButtonItem2: UIBarButtonItem = { le
class ViewController: UIViewController {
lazy var barButtonItem1 = UIBarButtonItem(barButtonSystemItem: .cancel, target: self, action: #selector(action1))
lazy var barButtonItem2: UIBarButtonItem = {
let barButtonItem = UIBarButtonItem(barButtonSystemItem: .cancel, target: self, action: #selector(action2))
return barButtonItem
}
override func viewDidLoad() {
super.viewDidLoad()
print(barButtonItem1.target, barButtonItem2.target)
}
}
打印的结果显示Barbuttoniem1.target为零,Barbuttoniem2.target为self,这似乎很疯狂!
当我使用Barbuttonem1的惰性变量编写时,我发现Barbuttonem1的操作永远不能被调用,最后问题是Barbuttonem1.target为nil
我不知道为什么会发生这种情况,但是我很确定这是一个bug。
有人知道这件事吗?如果你能解释一下,我将不胜感激。下面的解释是我的猜测。不幸的是,我没有足够的声誉发表评论,所以让我给你一个答案
我猜:这是一个编译器错误
首先,我制作了一个小规模的uibarbuttoneim扩展。(第二个参数不是
Any?
,而是UIViewController?
)
然后,我尝试用下面的代码初始化惰性存储变量
class ViewController: UIViewController {
lazy var barButtonItem1 = UIBarButtonItem(barButtonSystemItem: .cancel, targetViewController: self, action: #selector(action))
override func viewDidLoad() {
super.viewDidLoad()
print(barButtonItem1.target)
}
func action() { }
}
然后编译器抛出错误并说
无法将类型为“(NSObject)->()->ViewController”的值转换为
应为参数类型“UIViewController”
这表明编译器未能确定self
属于ViewController
。(UIKit提供的初始值设定项将被编译,因为第二个参数是Any?
,它接受(NSObject)->()->ViewController
类型的值)
但是当为惰性变量提供类型注释时,如
lazy var barButtonItem1: UIBarButtonItem = UIBarButtonItem(barButtonSystemItem: .cancel, targetViewController: self, action: #selector(action))
源代码被愉快地编译并barbuttonim1。target
被设置为self
我相信类型注释有助于编译。以上就是我猜您面临的问题是由编译器错误引起的原因
另请参见:报告的问题与您面临的问题类似。它们都被认为是一个编译器错误
我认为你做得不对。首先,必须使用数据类型声明惰性var。其次,您只是将其值设置为常规变量。请阅读:BarbuttoneM1的声明应该是正确的,根据。根据,BarbuttoneM1的声明应该是正确的。然而,我尝试了您所说的为Barbuttonim1添加数据类型声明,现在它表现良好。我仍然不知道这是什么原因。无论如何,谢谢你的评论!您不应该像那样实现bar按钮。您为什么需要这种类型的声明?谢谢!所以这确实是一个编译器错误,希望苹果能尽快修复它。现在,让我们只添加类型注释。
lazy var barButtonItem1: UIBarButtonItem = UIBarButtonItem(barButtonSystemItem: .cancel, targetViewController: self, action: #selector(action))