swift本身也是可以使用选择器的,并不需要通过桥接的方式使用选择器,但是使用的话必须要是 @objc或者@objcMembers修饰的方法才能定义选择器
关键字是#selector
假如我直接写一个#selector(go)其中go是函数,会报错Argument of '#selector' refers to instance method 'go()' that is not exposed to Objective-C
class Person :NSObject {
var name:String
var age:Int
init(name:String,age:Int) {
self.name = name
self.age = age
let sel = #selector(go)
}
@objc func go() {
print("person go")
}
}
而如果加个@objc去修饰下则不会出现这问题了,如果方法过多,那还是老方法在class 前面加上
@objcMembers class Person :NSObject
********其中继承NSObject不是必须的除非要使用NSObject的函数,我这只是之前写的代码没有删
@objcMembers class Person :NSObject {
var name:String
var age:Int
init(name:String,age:Int) {
self.name = name
self.age = age
}
func go() {
print("person go")
}
func fn1(_ v:Int) {
print("fn1",v)
}
func fn2(_ v:Int, v1:Int) -> Int {
v + v1
}
func fn3(_ v:Int, v1:Int) {
print(v + v1)
}
func test() {
perform(#selector(go))
perform(#selector(fn1(_:)))
perform(#selector(fn2(_:v1:)))
perform(#selector(fn3(_:v1:)))
}
}
Person(name: "yk", age: 10).test()
其中perform(aSelector: Selector, with:Any )的完整写法应该是这样的,是一种用runtime来调用函数的方式,with后面进行传参,我这为了图方便,就直接写了,这些函数会打印一些非法的值,