为什么我在进行可选链接时会出错?
Why do I get error when I do optional chaining?
protocol textingprotocol : class {
func didEnterText (text:String)
}
class secondViewController: UIViewController {
weak var delegate:textingprotocol?
@IBOutlet weak var txtField: UITextField?
@IBAction func dismissButton(sender: UIButton) {
delegate!.didEnterText(txtField?.text) // A: doesn't work
delegate!.didEnterText(txtField?.text!) // B: doesn't work
delegate!.didEnterText((txtField?.text)!) // C: works
}
答:我不是已经在做 可选链接 并且该行只有在文本有值时才有效,否则它会优雅地失败吗?
然而它给出:
Value of optional type 'String?' not unwrapped; did you mean to use
'!' or '?'?
B:即使出现上述编译器错误,我还是解包了它,但它仍然不满意它希望它像 C 一样。据我对 ?
的理解,我已经解包了 txtField 和!
我有展开的文本,仍然困惑为什么它不起作用
为什么 C 有效而 B 无效?难道没有比 C 行更简洁的方法吗? C线看起来很没有吸引力。
didEnterText
不带 String?
。它需要 String
。因此,您不能使用带有问号的简单可选链接来获取其参数。您必须实际解包为String
,而不是暂时解包为String?
-or-nil。
现在,txtField
是可选的,因此您需要将其解包。
而 UITextField 的 text
属性 是可选的,因此您也需要将其展开。
所以最简单的方法就是将它们都展开,绝对是:
delegate!.didEnterText(txtField!.text!)
如果你不想这样做(因为你担心其中之一会为零并使你的应用程序崩溃),你将不得不使用 if let
:[=20= 来保护整个事情]
if let s = txtField?.text {
delegate!.didEnterText(s)
}
protocol textingprotocol : class {
func didEnterText (text:String)
}
class secondViewController: UIViewController {
weak var delegate:textingprotocol?
@IBOutlet weak var txtField: UITextField?
@IBAction func dismissButton(sender: UIButton) {
delegate!.didEnterText(txtField?.text) // A: doesn't work
delegate!.didEnterText(txtField?.text!) // B: doesn't work
delegate!.didEnterText((txtField?.text)!) // C: works
}
答:我不是已经在做 可选链接 并且该行只有在文本有值时才有效,否则它会优雅地失败吗? 然而它给出:
Value of optional type 'String?' not unwrapped; did you mean to use '!' or '?'?
B:即使出现上述编译器错误,我还是解包了它,但它仍然不满意它希望它像 C 一样。据我对 ?
的理解,我已经解包了 txtField 和!
我有展开的文本,仍然困惑为什么它不起作用
为什么 C 有效而 B 无效?难道没有比 C 行更简洁的方法吗? C线看起来很没有吸引力。
didEnterText
不带 String?
。它需要 String
。因此,您不能使用带有问号的简单可选链接来获取其参数。您必须实际解包为String
,而不是暂时解包为String?
-or-nil。
现在,txtField
是可选的,因此您需要将其解包。
而 UITextField 的 text
属性 是可选的,因此您也需要将其展开。
所以最简单的方法就是将它们都展开,绝对是:
delegate!.didEnterText(txtField!.text!)
如果你不想这样做(因为你担心其中之一会为零并使你的应用程序崩溃),你将不得不使用 if let
:[=20= 来保护整个事情]
if let s = txtField?.text {
delegate!.didEnterText(s)
}