swift4.0下,使用字符串创建方法,发现无参数的可以实现,有参数的却怎么都调不了。用字符串创建方法哦,不是直接写方法名。
#selector(test:(string:))
用上面这种是必须要实现了该方法才能用,且不是从字符串直接转成方法的。我试过
Selector(test:)
Selector(test(string:))
Selector(test(:))
都不行,用perform调用都执行不了!
请问有什么方法,可以通过字符串直接转成方法调用,带参数的!
Selector(test:)
Selector(test(string:))
Selector(test(:))
可以直接赋值,系统会识别
首先 Selector 是 OC 里边儿的东西,涉及到运行时动态调用,这一点儿严格安全的Swift是不支持的。
Swift里边的Selector更多是为了和OC交互,而OC中Selector的使用场景在Swift中都有其他的解决方案
我看了题主的问题两遍,所理解的题主要解决的问题是:要在Swift中实现 动态调用一个带参数的方法,而这个方法可能还没实现,如果是,下面给出解决方案,如果不是,请题主补充问题
** 解决的方法很简单: 利用 协议 和 协议的默认实现,无论这个类是否实现了这个方法,只要它实现了相关协议(有默认实现),你只管调用便是。**
protocol someProtocol {
func exampleFunction(parm: String)
}
extension someProtocol {
//协议的默认实现
func exampleFunction(parm: String) {
print("我是默认的协议实现,当你看到我,说明你所调用的类并没有覆盖我的实现")
}
}
class ViewController: UIViewController, someProtocol {
override func viewDidLoad() {
super.viewDidLoad()
//尽情调用,不用搞什么字符串Selector
self.exampleFunction(parm: "winter is Coming!")
}
//实现协议,覆盖默认实现(你不实现,上边照样可以调用)
func exampleFunction(parm: String) {
print(parm)
}
}
class ViewController2: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// 1. 动态获取某个类名
// let otherClass = NSClassFromString("S.ViewController") as! UIViewController.Type// S. 加命名空间前缀
// let instance: someProtocol = otherClass.init() as! someProtocol//声明它实现了协议(告诉编译器:它有那个方法)
// 2. 直接调用
let instance = ViewController()
instance.exampleFunction(parm: "winter has comed!")
}
}
以上, 希望可以帮助到你!
ps: 这个Markdowm 编辑器是真难用!