gpt4 book ai didi

ios - swift 2.0 - UITextFieldDelegate 协议(protocol)扩展不工作

转载 作者:IT王子 更新时间:2023-10-29 05:12:34 25 4
gpt4 key购买 nike

我正在尝试使用像这样的协议(protocol)扩展在某些 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 所建议的,默认协议(protocol)的方法实现不适用于标记为@objc 的协议(protocol)。但是,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

最佳答案

我不能 100% 肯定,但这是我认为正在发生的事情:

ObjC 无法访问协议(protocol)扩展。由于 UITextFieldDelegate 是一个 ObjC 协议(protocol),它依赖于 ObjC 调度。就编译器而言,默认实现中的方法是不可访问的,即使它们确实存在。

澄清一下,如果它确实是一个扩展并添加行为,我们可以扩展这些协议(protocol)。此行为只能在 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 {
}

好吧,我知道我正在考虑一个不同的问题,虽然这个编译,但它不会工作,问题是动态调度。如果您尝试使用 @objcdynamic 附加您的方法,编译器将警告您不能以这种方式分派(dispatch),除非是在类上。由于协议(protocol)异常不符合此要求,因此当 ObjC 发送消息时,它无法在您的扩展中找到实现。

由于 Swift 不断更新,以下是此答案适用的时间:

swift 2.0 Xcode 7 通用

关于ios - swift 2.0 - UITextFieldDelegate 协议(protocol)扩展不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32542362/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com