Swift中如何正确使用#selector?两种写法的技术选型疑问
关于WKWebView.reload搭配#selector的正确写法解析
嘿,这个问题问得特别务实!我来帮你理清楚在给iOS内嵌网页浏览器加刷新按钮时,#selector的正确用法~
首先先把你提到的两种写法补全,方便对比:
写法一:类名.方法名
let webView = WKWebView() view = webView navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .refresh, target: webView, action: #selector(WKWebView.reload))
写法二:实例.方法名
let webView = WKWebView() view = webView navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .refresh, target: webView, action: #selector(webView.reload))
核心结论
两种写法在功能表现上完全等价,因为它们最终获取的是同一个方法选择器(SEL)——reload作为WKWebView的实例方法,其选择器是和类绑定的,不管通过类名还是实例来引用,拿到的都是同一个SEL。
但从Swift的代码规范、可读性和健壮性来说,更推荐使用#selector(WKWebView.reload)这种类名限定的写法,原因有两个:
- 可读性更强:明确指向WKWebView类的reload方法,别人看代码时一眼就能知道你要调用的是系统WebView的刷新方法,不会和自定义的同名方法混淆。
- 避免歧义:如果你的代码中存在其他同名的局部变量、扩展方法或者自定义类型的reload方法,用类名限定可以确保你拿到的是正确的系统方法选择器。
另外要提醒你:如果调用的是带参数的实例方法,需要在selector里加上对应的冒号,比如#selector(WKWebView.reload(_:)),不过这里WKWebView的reload是无参方法,所以直接写#selector(WKWebView.reload)就完全正确啦。
最后还要给你点个赞:你把target参数设为webView实例是完全正确的,因为reload是WKWebView的实例方法,必须由WKWebView的实例来执行,这一步没出错~
内容的提问来源于stack exchange,提问作者user7427753
相关产品推荐
相关产品推荐

