斯威夫特2:!,? - "可选类型的值" ..."没有打开"

时间:2015-11-07 20:14:46

标签: swift swift2

  

可选类型的值" ..."没有打开;你的意思是使用'!'或者'?'?

有人可以解释一下这个错误信息究竟意味着什么吗?我什么时候应该使用'?'当'!'?

3 个答案:

答案 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

两个标志都是特殊枚举的后缀运算符。具有任何这些符号的对象意味着它可以为空。

  • ? - 是可选的
  • ! - 是ImplicityUnwrappedOptional

收到通知,“字典”将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)