@objc小结

 原文

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兼容。

猜你喜欢

转载自justsee.iteye.com/blog/2263959