【发布时间】:2017-02-06 23:48:34
【问题描述】:
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
}
A:我是不是已经在进行 可选链接 并且该行仅在文本具有值时才有效,否则它会优雅地失败? 然而它给出了:
可选类型“字符串?”的值未拆封;你的意思是用 '!'还是“?”?
B:即使我得到了上述编译器错误,我确实解开了它,但它仍然不满意它希望它像 C 一样。据我了解,? 我已经解开了 txtField 和 @987654323 @我有解开的文字,仍然困惑为什么它不起作用
为什么 C 可以工作而 B 不行?没有比 C 行更清洁的方法吗? C线看起来很不吸引人。
【问题讨论】:
-
应该是
@IBOutlet weak var txtField: UITextField! -
@LeoDabus 哈哈。谢谢。但查看
text属性。为什么这是可选的?我的意思是为什么我 Cmmd+click 它显示@property (nonatomic, readonly) NSString *text;它没有显示类似text:String?的任何东西 它是如何从 Objective-c 转换为可选的? -
我不是 swift 专家,所以我会留下评论而不是答案...
didEnterText需要一个非零值,所以我的理解是选项 B 如果@987654329 @ is nil 甚至不会评估该语句的.text部分,因此添加.text!并不能解决 nil 文本字段的问题。在选项 C 中,所有编译器看到的是一个“保证”为非零的值,因为整个东西都被包裹在括号中...... -
请问
textingprotocol是如何定义的? -
@matt 查看更新
标签: swift optional optional-chaining