Swift 与 OC的互相使用tips

Swift要使用OC代码

  • Case1 : 如果是主工程里,则需要将对应的OC头文件放入 生成的  “-Bridging-Header.h” 头文件里。
  • Case2: 如果是子工程,必须将OC对应的头文件设为Public;再将该头文件放入modular header里来import。

Swift使用OC的 枚举。(不同的声明方式对应不同的使用方式)

**Case1: **

typedef enum : NSUInteger {
    XXXX1,
} XXXX;
  • 在swift中:
let vv : XXXX = XXXX1

Case2:

typedef NS_ENUM(NSUInteger, JapaneseFoodType1) {
    JapaneseFoodType1_Sushi = 1,
    JapaneseFoodType1_Tempura = 2,
};
  • 在swift中:
let v : JapaneseFoodType1 = .sushi

PS:也都可以用 init(rawValue:) 来使用,但不推荐。

Swift 使用OC的指针

  • Swift 端的指针类型有:
    1. UnsafePointer: 类似于const Pointee *
    2. UnsafeMutablePointer: 类似于Pointee *
    3. UnsafeRawPointer: 类似于const void *
    4. UnsafeMutableRawPointer: 类似于void *
//OC传指针给Swift
//Swift端
@objc
class SwiftClosure : NSObject {
	@objc class func test1(_ ptr: UnsafeMutablePointer<Int>) {
        	ptr.pointee += 10
	}
}
//OC端
NSInteger b = 4;
[SwiftClosure test1:&b]; //b 为 14
//Swift传指针给OC
//Swift端
var intV = 4
var intVP = withUnsafeMutablePointer(to: &intV) {
       $0
}
ClassForSwift1.myPointer(intVP) //intV 为 8
//OC端
+ (void)myPointer:(NSInteger *) intP {
    *intP += 4;
}

Swift的指针常用方法

//分配内存,创建指针,类型是 UnsafeMutableRawPointer
let p = malloc(50)
//另一个指针指向 offset 16的位置
let anotherPointer = p! + 16 //或者用 p!.advanced(by: 16)
//写入数据到指定位置
p?.storeBytes(of: 55, toByteOffset: 16, as: Int.self)
//获取内存制定位置的值
var p1 : Int = p!.load(fromByteOffset: 0, as: Int.self)

//销毁内存
free(p)

//创建 大小为3个Int的内存指针
var ptr = UnsafeMutablePointer<Int>.allocate(capacity: 3)
// 先初始化内存
ptr.initialize(to: 11)
        // ptr.successor表示下一个Int,也就是跳一个类型字节大小
        ptr.successor().initialize(to: 22)
        ptr.successor().successor().initialize(to: 33)
        print(ptr.pointee) // 11

        // ptr + 1,意味着跳过一个Int类型大小的字节数
        print((ptr + 1).pointee) // 22
        print((ptr + 2).pointee) // 33
        // 释放要调用反初始化,调用了几个就释放几个
        ptr.deinitialize(count: 3)
        ptr.deallocate()

//RawPointer 和 Pointer之间的转换
let convertedIntP : UnsafeMutablePointer<Int> = p!.assumingMemoryBound(to: Int.self)
let convertedIntP2 : UnsafePointer<Int> = unsafeBitCast(p!, to: UnsafePointer<Int>.self)