不能对“ViewController”类型的非可选值使用可选链接

Posted

技术标签:

【中文标题】不能对“ViewController”类型的非可选值使用可选链接【英文标题】:Cannot use optional chaining on non-optional value of type 'ViewController' 【发布时间】:2021-05-06 09:36:01 【问题描述】:

我对 swift 完全陌生,并且遵循有关创建待办事项列表应用程序的教程。只要我在self.createItem(name: text 中添加问号,就会收到错误Cannot use optional chaining on non-optional value of type 'ViewController'

@objc private func didTapAdd() 
        let alert = UIAlertController(title: "New Item", message: "Enter new Item", preferredStyle: .alert)
        alert.addTextField(configurationHandler: nil)
        alert.addAction(UIAlertAction(title: "Submit", style: .cancel, handler: 
            _ in
            guard let field = alert.textFields?.first, let text = field.text, !text.isEmpty else 
                return
            
            self?.createItem(name: text)
        ))
        present(alert, animated: true)
        
    

【问题讨论】:

删除“?”来自self?.createItem(name: text)。它看起来像:self.createItem(name: text) 阅读更多关于 swift 中的弱自我 【参考方案1】:

问题在于您没有将 self 变量声明为弱变量以使其成为可选变量。如下使用弱 self 使 ViewController 的 self 实例成为可选。然后你就可以使用问号了。

@objc private func didTapAdd() 
        let alert = UIAlertController(title: "New Item", message: "Enter new Item", preferredStyle: .alert)
        alert.addTextField(configurationHandler: nil)
        alert.addAction(UIAlertAction(title: "Submit", style: .cancel, handler:  [weak self] (_) in
            guard let field = alert.textFields?.first, let text = field.text, !text.isEmpty else 
                return
            
            self?.createItem(name: text)
        ))
        present(alert, animated: true)
        
    

【讨论】:

@sokoine 如果它解决了您的问题,请将答案标记为已接受:)

以上是关于不能对“ViewController”类型的非可选值使用可选链接的主要内容,如果未能解决你的问题,请参考以下文章

问题:我的非可选变量为零。 (展开时出现致命错误)

如何自动创建一个实体,它与我正在创建的实体具有一对一的非可选关系?

为啥你可以在 Swift 中为可选类型分配非可选值?

斯威夫特 3;用非可选字符串附加可选字符串

无法强制解开非可选类型“UIImage”的值

通过应用过滤器摆脱 nil 后将类型更改为非可选