美文网首页
Swift、OC混用

Swift、OC混用

作者: z4ywzrq | 来源:发表于2019-12-11 17:11 被阅读0次

    原文链接:http://yupeng.fun/2019/12/11/swift-oc/

    简介

    本文介绍一下,Swift、OC 的互相调用的方法。
    两种情况,OC 中调用 Swift 的情况,和 Swift 中调用 OC 的情况。本文是在当前最新的环境下的操作,Swift 5、Xcode 11.3。

    1、OC 中调用 Swift 的情况

    在 OC 的项目中新建一个 Swift 的文件,在创建的同时,Xcode 会弹出提示是否创建桥接文件,选择创建,然后会发现 Xcode 会自动创建一个桥接文件 xxx-Bridging-Header.h

    然后在 OC 的代码中导入头文件 #import "xxx-Swift.h" , 这个是 Xcode 自动生成的 Swift 转 OC 的接口头文件,项目名称命名,"项目名-Swift.h",这个在工程配置 Build Settings 中 Swift Compiler - General,可以看到。导入后,在 OC 文件中就可以使用 Swift 了。
    如果出现报错,'xxx-Swift.h' file not found 需要设置一下配置信息,targets -> Build Settings -> 搜索 packaging 找到 Defines Module 设置为 Yes,然后重新编译就会成功了。

    然后就是在 Swift 文件中编写代码,这里要注意想要在 OC 中使用 Swift 中的类,需要继承自 NSObject,属性和方法要想在 OC 中使用需要加上 @objc。
    在 Swift 4 之前,如果你用 Swift 写的 class 是继承自 NSObject 的话,Swift 会默认自动为所有的非 private 的类和成员加上 @objc。
    另外,如有需求需要 OC 和 Swift 中使用不一样的方法名或者类名,可以使用 @objc(xxx) 转换成希望用到的名字。

    //swift 文件
    import Foundation
    
    class Person: NSObject  {
        @objc var name: String?
        var age: Int?
        
        @objc func sayHello(name: String) {
            print("hello \(name)")
        }
        
        @objc(greeting:)
        func 打招呼(名字: String) {
            print("你好,\(名字)")
        }
        
    }
    
    //在 OC 中调用
    #import "xxx-Swift.h"
    Person *p = [[Person alloc] init];
    [p sayHelloWithName:@"abc"];
    [p greeting:@"123"];
    

    点击导入的头文件,#import "xxx-Swift.h",跳转进去可看到系统将 Swift 转换后的代码:

    2、Swift 中调用 OC 的情况

    在 Swift 的项目中,新建一个 OC 的文件,同样也会创建一个桥接文件 xxx-Bridging-Header.h,在这个桥接文件用来导入要暴露给 Swift 要用的头文件。

    创建好 OC 文件后,在 xxx-Bridging-Header.h 导入 OC 的头文件,然后再 Swift 代码中就可以使用了。

    3、可能遇到的问题

    在从 Swift 低版本升级的时候,可能会报错:


    这是需要设置一下:


    相关文章

      网友评论

          本文标题:Swift、OC混用

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