Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/97.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iOS lazy var UIBarButtonItem目标问题_Ios_Swift_Uibarbuttonitem_Lazy Evaluation_Target - Fatal编程技术网

iOS lazy var UIBarButtonItem目标问题

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

我在使用惰性var初始化时无意中发现了这个uibarbuttonite目标问题

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))