@objc小结

15 篇文章 0 订阅

 原文

1 、Selector(oc/swift)中调用swift类中私有方法需要在方法前声明 @objc

  @objc private func privateSayHello(){

        print("\(__FUNCTION__)")

    }

比如NStime ,performSelector中用到Selector:

[video performSelector:@selector(privateSayHello)];

2、 swfit提供oc调用接口

在swift类前加 @objc可以提供给oc调用的接口(xcode7beta4之前)

还可以让swift继承NSOject实现同样的效果。

ps:在xcode7beta4必须继承NSOject,只写 @objc会报错:Only classes that inherit from NSObject can be declared @objc

class VideoItem:NSObject{

    weak var delegate:MyClassDelegate?

    var name: String

    

    init(name:String){

        self.name = name

    }

}

 

3、 修改swift中类名/属性名/方法名给oc使用

@objc(GameSwfitItem)

class GameItem:NSObject{

    @objc(swiftName)

    var name: String

    

    @objc(initSwift:)

    init(name:String){

        self.name = name

    }

}

 

GameSwfitItem *game = [[GameSwfitItem alloc] initSwift:@"007g"];

NSLog(@"%@",game.swiftName);

 

4 、提供可选协议给类使用

@objc protocol OptionalProtocol{

    @objc optional func optionalMethold1()

    @objc optional func optionalMethold2()

    func requestMethold1()

}

局限性:加@objc的协议只能类使用(继承oc的类或加@objc的类),struct,enum不可以使用。

              每个可选方法都需要加optional

swfit2中推荐可选方法用protocol eatension实现可选方法

 

5、 weak delegate

protocol MyClassDelegate{

    func methold1()

}

class VideoItem:NSObject,MyClassDelegate{

    weak var delegate:MyClassDelegate?

}

你直接这样写会报错:'weak' cannot be applied to non-class type ‘MyClassDelegate’,因为struct,enum中在arc中没有weak这种概念,不是引用计数来管理内存的。

可以在protocol前加@objc

@objc protocol MyClassDelegate{

    func methold1()

}

 

或者在protocol声明后加class

protocol MyClassDelegate:class{

    func methold1()

 

}

 

 

这样他们只能被类使用,其实用class更能表现问题的实质,同时避免了过多不必要的oc兼容。

 

 

 

 

 

 

 

 

 

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值