首页 热点资讯 义务教育 高等教育 出国留学 考研考公
您的当前位置:首页正文

Swift5.1 - oc到swift过渡

2024-12-15 来源:化拓教育网

条件编译

#if os(macOS) || os(iOS)
// 操作系统

#elseif arch(x86_64) || arch(arm64)
// 架构

#elseif swift(<3) || swift(>=5)
// swift版本号

#elseif targetEnvironment(simulator)
// 模拟器

#elseif canImport(Foundation)
// 是否能导入某个模块

#else

#endif

系统版本号检查

if #available(iOS 13, macOS 10.12, *) {
    // .....
}

MARK、TODO、FIXME

swift调用oc

  • 新建1个桥接头文件,文件名格式默认为:{targetName}-Bridging-Header.h


  • 在 {targetName}-Bridging-Header.h 使用 #import "Person.h" 暴露给swift调用;



oc调用swift

  • Xcode 已经默认生成一个用于oc调用swift的头文件,文件名格式是{targetName}-Swift.h;


  • swift 暴露给oc的类最终继承NSObject

  • 使用@objc修饰的属性,是暴露给oc的成员;

  • 使用@objcMembers修饰的类,是暴露给oc使用类

    1. 代表默认所有成员都会暴露给oc(包括扩展中定义的成员)

swift文件中定义:

@objcMembers class Cat: NSObject {
    var age: Int
    var name: String
    
    init(age: Int, name: String) {
        self.age = age
        self.name = name
    }
    
    func eat() {
        print("cat eat")
    }
}

oc文件中调用:

#import "ocToSwift-Swift.h"

void test() {
    Cat *cat = [[Cat alloc] initWithAge:10 name:@"xiaohei"];
    [cat eat];
}

  • 可以通过@objc来重命名暴露给oc的类名、属性名、方法;
    swift文件中定义:
@objc(BYCat)
@objcMembers class Cat: NSObject {
    var age: Int
    
    @objc(color)
    var name: String
    
    init(age: Int, name: String) {
        self.age = age
        self.name = name
    }
    
    func eat() {
        print("cat eat")
    }
}

oc文件中调用:

#import "ocToSwift-Swift.h"

void test1() {
    BYCat *cat = [[BYCat alloc] initWithAge:20 name:@"白色"];
    cat.color = @"黑色";
}

选择器

  • 在swift中,使用#selector(name)定义一个选择器;
  • 必须被 @objcMembers@objc 修饰的方法,才能定义选择器;
@objcMembers class Cat: NSObject {
    func test1() { print("test1") }
    func test2() { print("test2") }
    func test() {
        perform(#selector(test1))
    }
}
显示全文