@objc private func privateSayHello(){
print("\(__FUNCTION__)")
}
比如NStime ,performSelector中用到Selector:
[video performSelector:@selector(privateSayHello)];
在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
}
}
@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);
@objc protocol OptionalProtocol{
@objc optional func optionalMethold1()
@objc optional func optionalMethold2()
func requestMethold1()
}
局限性:加@objc的协议只能类使用(继承oc的类或加@objc的类),struct,enum不可以使用。每个可选方法都需要加optional
swfit2中推荐可选方法用protocol eatension实现可选方法
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兼容。
Swift 3中dynamic是自带@objc,但是Swift 4中,dynamic不在包含@objc了。所以有些需要使用到@objc标明的方法,在Swift 4得补回去。
针对方法、属性、下标、或构造器的声明使用该特性将覆盖隐式的 objc 特性。nonobjc 特性告诉编译器该声明不能在 Objective-C 代码中使用,即便它能在 Objective-C 中表示。
该特性用在扩展中,与在没有明确标记为 objc 特性的扩展中给每个成员添加该特性具有相同效果。
可以使用 nonobjc 特性解决标有 objc 的类中桥接方法的循环问题,该特性还允许对标有 objc 的类中的构造器和方法进行重载。
标有 nonobjc 特性的方法不能重写标有 objc 特性的方法。然而,标有 objc 特性的方法可以重写标有 nonobjc 特性的方法。同样,标有 nonobjc 特性的方法不能满足标有 @objc 特性的协议中的方法要求。