程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了swift 2.0-UITextFieldDelegate协议扩展不起作用大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决swift 2.0-UITextFieldDelegate协议扩展不起作用?

开发过程中遇到swift 2.0-UITextFieldDelegate协议扩展不起作用的问题如何解决?下面主要结合日常开发的经验,给出你关于swift 2.0-UITextFieldDelegate协议扩展不起作用的解决方法建议,希望对你解决swift 2.0-UITextFieldDelegate协议扩展不起作用有所启发或帮助;

我不能100%积极,但是我相信这是正在发生的事情:

无法从访问协议扩展ObjC。由于UITextFIEldDelegateObjC协议,因此它依赖于ObjC调度。就编译器而言,默认实现中的方法即使存在也无法访问。

为了明确起见,我们可以扩展这些协议(如果它确实是扩展名)并增加行为。此行为只能在Swift中访问,并且绝不会出现任何问题。

问题是默认实现无法ObjC访问。

这是自定义版本的快速示例:

@objc protocol Test : class {
    func someFunc() -> String
}

extension Test {
    func someFunc() -> String {
        return ""
    }
}

// Fails here 'candIDate is not @objc but protocol requires it`
class Hi : NSObject, Test {

}

Xcode建议附加,@objc但是它将一遍又一遍地建议,直到您得到@objc @objc @objc Hi : ...

根据下面的对话,我认为这很有效。我还不能完全解释原因:

@objc public protocol Toto: UITextFIEldDelegate {
    optional func randomInt() -> Int
}

extension Toto {
    func randomInt() -> Int {
        return 0
    }
    func textFIEldShouldReturn(textFIEld: UITextFIEld) -> Bool {
        return false
    }
}

class Tata: NSObject, Toto {
}

好的,我意识到我正在虑一个不同的问题,尽管此问题可以编译,但无法正常工作,而该问题是动态调度。如果尝试使用w@objc或追加方法dynamic,则编译器会警告您除类之外,不能以这种方式分派。由于协议异常不符合此要求,因此ObjC调度消息发送时,无法在扩展中找到实现。

由于Swift一直在不断更新,因此适用此答案的时间是:

Swift 2.0 Xcode 7 GM

解决方法

我正在尝试UITextFieldDelegate使用协议扩展在某些方法上添加默认行为,例如:

extension ViewController: UITextFieldDelegate {
    // Works if I uncommented this so I know delegates are properly set
//    func textFieldShouldReturn(textField: UITextField) -> Bool {
//        textField.resignFirstResponder()
//        return true
//    }
}

extension UITextFieldDelegate {
    func textFieldShouldReturn(textField: UITextField) -> Bool {
        textField.resignFirstResponder()

        return true
    }
}

您可能会猜到,键盘永远不会消失。我真的看不出问题出在哪里。这是语言限制吗?有人已经成功做到了吗?

编辑:

正如@Logan所建议的,默认协议的方法实现不适用于标记为的协议@objc。但是,UITextFieldDelegate具有以下签名public protocol UITextFieldDelegate : NSObjectProtocol {...}

我已经测试了默认的实现NSObjectProtocol,它似乎运行良好:

protocol Toto: NSObjectProtocol {
    func randomInt() -> Int
}

extension Toto {
    func randomInt() -> Int {
        return 0
    }
}

class Tata: NSObject,Toto {}

let int = Tata().randomInt() // returns 0

大佬总结

以上是大佬教程为你收集整理的swift 2.0-UITextFieldDelegate协议扩展不起作用全部内容,希望文章能够帮你解决swift 2.0-UITextFieldDelegate协议扩展不起作用所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。