Swift和OC混编 - 2 选择器

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后面进行传参,我这为了图方便,就直接写了,这些函数会打印一些非法的值,

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值