可选类型的值" ..."没有打开;你的意思是使用'!'或者'?'?
有人可以解释一下这个错误信息究竟意味着什么吗?我什么时候应该使用'?'当'!'?
答案 0 :(得分:22)
obj?.fn()
调用fn
成员函数,否则无法执行任何操作。
obj!.fn()
断言obj
不为空,并调用fn
。如果对象 为null,则会出现异常。
所以它在自信方面有所不同:你要么或者只是要求可以为空的对象的可空属性。
答案 1 :(得分:2)
什么是String?
。它是一个可选的字符串,还是一个可选的字符串'具有String'的相关值。
只有第二个定义是正确的。要访问String上的任何成员/属性或在字符串上运行函数,您必须在可选'的相关值上执行此操作。这需要你解开可选的。
我知道有两种方法可以创建此错误:
第一
如果你有
@IBOutlet weak var display : UILabel? // FYI IBOutlets must be optional...
let something = display.text // Line C
let something = display!.text // Line D
您将在C行收到以下错误:
可选类型的价值' UILabel?'没有打开;你的意思是用吗? '!'或者'?'?
这是因为您在可选内容上发送了text
消息,但是可选项本身并不了解text
方法,但其未解包的相关值' - UILabel!
可以理解。因此,您必须将其写为D行
说到正确的方法是从头开始打开UILabel然后轻松访问其文本:
@IBOutlet weak var display : UILabel!
let something = display.text
<强>第二强>
cell.textLabel?.text = bug.name // Line A: you are messaging text on *optional* textLabel
cell.textLabel.text = bug.name // Line B: you are messaging text on textLabel
在B行上您正在访问textLabel
,这是一个可选的,具有相关类型的UILabel 。
它将产生以下错误:
可选类型的价值&#39; UILabel?&#39;没有打开;你的意思是用吗? &#39;!&#39;或者&#39;?&#39;?
您可以转到UITableViewCell.swift
并查看其声明为:
public var textLabel: UILabel? { get } // default is nil. label will be created if necessary.
UILabel?
是可选表单中的属性。
答案 2 :(得分:-2)
Swift 2
两个标志都是特殊枚举的后缀运算符。具有任何这些符号的对象意味着它可以为空。
收到通知,“字典”将IUO转换为Optional。 这两个枚举也支持可选链接。
通过研究下一个代码,您可以获得有关此主题的更多经验:
var dict: [String: Optional<Int>] = ["b": ImplicitlyUnwrappedOptional.Some(5), "c": c]
print(dict["b"]!!)
print(dict["b"]! as? ImplicitlyUnwrappedOptional<Int>)
print(dict["c"])
print(dict["c"]! is ImplicitlyUnwrappedOptional<Int>)
print(c is ImplicitlyUnwrappedOptional<Int>)
guard let bValue = dict["b"] else { return }
print(bValue)