You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:24:40