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{
optional func optionalMethold1()
optional func optionalMethold2()
func requestMethold1()
}
局限性:加@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兼容。