🐻 OC调用Swift的闭坑操作

1,225 阅读1分钟

一、继承NSObject的类

  • 类不需要@objc标记

  • 方法需要标记为 @objc

class CTPermission: NSObject {
    
 @objc func request(id:Int,name:String) -> String{
        
        return ""
 }
    
}

@objc 的作用是改变函数的派发方式,如果没有添加@objc则函数的派发方式为函数表派发。@objc 修饰后函数的派发方式为消息派发

注意:当 request() 函数没有被重写时,此函数的派发方式会被优化成直接派发。

  • 成员变量需要 @objc
class CTPermission: NSObject {
    
 @objc let name:String = "xuenai~"
 @objc static let name:String = "xuenai~"

  • 成员变量、函数 还可以用另一种方式使得让OC访问 #@objcMembers#
@objcMembers
class Permission:NSObject{
    /// function
    func request(id:Int,name:String) -> String{
        
        return ""
    }
    
    /// member
    var name:String = "xuenai~"
    static let name:String = "xuenai~"

}
  • var、let

无论是var还是let

  • 修饰的String,转到OC后都是NSString

  • 修饰的NSMutableString,转到OC后都是NSMutableString

  • 修饰的Array,转到OC后都是NSArray

  • int 转到OC 后都是 NSInteger

  • 即使是NSMutableString,也需要用上面两种方式修饰(@objc或者@objcMembers)

  • 枚举必须是int类型

@objc enum PermissionType:Int {
    case photo
    case micphone
}

  • struct 在OC中是无法使用的

  • 全局变量、全局函数 在OC中是无法使用的

二、Swift中调用OC

  • OC类中的

    • int -> Int32
    • NSInteger -> Int
    • NSNumber ->NSNumber
    • NSValue -> NSValue
  • OC类中的枚举

typedef enum RequestType: NSUInteger {
    RequestTypeNone,
    RequestTypeSex,
    RequestTypeName,
} RequestTypeDefault;