Gag*_*iOS 4 delegates access-modifiers compiler-warnings ios swift
我正在开发一个为每个应用程序功能创建模块的应用程序。我必须从一个模块UI控制器切换到另一个模块UI控制器。
我在模块中有UIController,并将该控制器标记为公共访问标识符,如下所示
public class InterAccountTransferViewController: UIViewController {
override public func viewDidLoad() {
......
......
}
}
Run Code Online (Sandbox Code Playgroud)
上面的类还实现了扩展中的UITextField委托。当我将上述类创建为“开放访问”时,我在TextField委托上收到警告,如下所示
实例方法“ textFieldDidBeginEditing”几乎与协议“ UITextFieldDelegate”的可选要求“ textFieldDidBeginEditing”匹配
现在不调用文本字段委托。当我试图通过将代表设置为私人身份来关闭警告时,仍然没有调用他们。
请让我知道如何使这些警告静音并同时致电代表。
任何想法或建议都很好。我正在使用Swift 4.2开发Xcode 10。请让我知道是否需要进一步解释我的问题。
使用“几乎匹配”,编译器会告诉您两件事:
编译器很好地告诉您这是一个问题。它不是很好,不能解释问题的确切原因。
问题是您的类比委托方法具有更高的可见性。您的类为public,而您的委托方法为internal(因为internal默认值,如果声明中没有访问说明符,则为默认值)。
解决方法是也为委托方法提供public访问说明符。
你必须改变
func textFieldDidBeginEditing(_ textField: UITextField) {
// ...
}
Run Code Online (Sandbox Code Playgroud)
至
public func textFieldDidBeginEditing(_ textField: UITextField) {
// ...
}
Run Code Online (Sandbox Code Playgroud)
这将使编译器知道该方法确实旨在成为委托方法。
奖励内容...
我如何找到解决方案?我在Xcode中重现了该问题。我单击了警告并阅读了修正:“使'textFieldDidBeginEditing'为非公开,以使此警告静音”。我单击“修复”,该行更改为“专用函数textFieldDidBeginEditing(_ textField:UITextField)”。因此,我认为也许将其public改为而不是private会有所帮助。我尝试了一下,检查了一下,结果成功了。
为什么Swift会这样做?我不确定,但是我的猜测是:如果一个类是公共的,但是protocol方法是内部的,则意味着从模块的角度查看时,单个视图控制器对象将实现协议。但是由于协议实现是内部的,因此从外部模块(例如,从UIKit)的角度看时,协议方法将不可用。但这在Objective C运行时中是不可能的,即使可能,那也是很糟糕的。可以使协议方法无声地公开或半公开,但不是很干净:例如,可以将textFieldDidBeginEditing内部设置,但是将对象强制转换为UITextFieldDelegate伪对象时,您可以突然调用该方法,奇怪。