Skip to content

Latest commit

 

History

History
121 lines (84 loc) · 3.48 KB

2015-12-14-@objc小结.md

File metadata and controls

121 lines (84 loc) · 3.48 KB

@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

ps:在 Swift 4 中,隐式 @objc 自动推断只会发生在很少的当必须要使用 @objc 的情况,比如:

1、复写父类的 Objective-C 方法

2、符合一个 Objective-C 的协议

其它大多数地方必须手工显示的加上 @objc。

减少了隐式 @objc 自动推断后, Music app 的包大小减少了 5.7%。

class VideoItem:NSObject{
    weak var delegate:MyClassDelegate?
    @objc var name: String
    
    @objc 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兼容。

TestObjc

6、KVO

Swift 3中dynamic是自带@objc,但是Swift 4中,dynamic不在包含@objc了。所以有些需要使用到@objc标明的方法,在Swift 4得补回去。

nonobjc

针对方法、属性、下标、或构造器的声明使用该特性将覆盖隐式的 objc 特性。nonobjc 特性告诉编译器该声明不能在 Objective-C 代码中使用,即便它能在 Objective-C 中表示。

该特性用在扩展中,与在没有明确标记为 objc 特性的扩展中给每个成员添加该特性具有相同效果。

可以使用 nonobjc 特性解决标有 objc 的类中桥接方法的循环问题,该特性还允许对标有 objc 的类中的构造器和方法进行重载。

标有 nonobjc 特性的方法不能重写标有 objc 特性的方法。然而,标有 objc 特性的方法可以重写标有 nonobjc 特性的方法。同样,标有 nonobjc 特性的方法不能满足标有 @objc 特性的协议中的方法要求。