Swift5.1 - oc到swift过渡

作者: HChase | 来源:发表于2019-08-29 16:54 被阅读28次

    条件编译

    #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))
        }
    }
    

    相关文章

      网友评论

        本文标题:Swift5.1 - oc到swift过渡

        本文链接:https://www.haomeiwen.com/subject/onniectx.html