swift UITextFieldDelegate 扩展

swift UITextFieldDelegate extension

我是 swift 的新手,我无法理解以下情况。我正在尝试使用几个 UITextFieldDelegate 函数扩展 UIViewController class...

class ViewController: UIViewController{
    @IBOutlet weak var textField: UITextField!

    override func viewDidLoad() {
        super.viewDidLoad()
        textField.delegate = self

在另一个文件中,如果我定义函数时参数解包,函数不会被调用...

extension UIViewController: UITextFieldDelegate{

    internal func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
        print("Text Field Should Begin Editing called")
        return true
    }

但是如果我打开参数,它就可以工作了。

    internal func textFieldShouldBeginEditing(_ textField: UITextField!) -> Bool 

你能帮我理解为什么吗? 谢谢

swift 4.2

因为 Objective-C 不保证对象非零,Swift 使参数类型中的所有 类 和导入的 return 类型可选 Objective-C API。在使用 Objective-C 对象之前,您应该检查以确保它没有丢失。

如果您使用 _ textField: UITextField 参数可以为空,因此委托不会调用该方法,因为它在方法签名中寻找非空值,即 internal func textFieldShouldBeginEditing(_ textField: UITextField!) -> Bool

在您的扩展文件中,您应该扩展 您的 ViewController class,而不是 UIViewController class .你不需要解开力。所以它应该是这样的:

extension UIViewController: UITextFieldDelegate{
    func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
         print("Should begin editing!")   
    }
}