OC与Swift混合开发

963 阅读2分钟

OC工程使用Swift的Framework

假如有一个纯OC的项目引用了许多OC的framework,我们计划将OC的framework替换成Swift的framewofk该怎么做呢?

准备工作

  1. 创建一个OC工程MyOCProject,我在这里使用的Xcode版本是13.0。
  2. 创建一个Swift静态库MySwiftFrameworkA,里面我只写了一个类,如下:
import UIKit

public class MySwiftClassA: NSObject {
    @objc public func runSwiftFunA() {
        print("\(NSStringFromClass(type(of: self)))--运行函数--\(#function)")
    }
}

这里有两点需要注意,类需要使用public修饰;函数需要用@objc public修饰,否则OC中会找不到可调用的函数。

静态库设置Clang Model为Yes,Xcode13.0默认就是Yes:

未命名.png

Xcode13中你可能找不到生成的framework所在的路径,查找方法如下:顶部菜单栏->Product->Show Build Folder in Finder。

  1. 将MySwiftFrameworkA拷贝到工程根目录下(拷贝到其他地方会找不到),接下来引入:TARGETS->MyOCProject->General->Frameworks,Libraries,and Embedded Content->点击+号->add Other->add files->找到MySwiftFrameworkA

未命名.png

  1. 在需要调用MySwiftFrameworkA中代码的文件中引入swift静态库module:
@import MySwiftFrameworkA;

调用swift类和函数:

MySwiftClassA *classA = [MySwiftClassA new];
[classA runSwiftFunA];

这时候编译报错了:

未命名.png

从报错中我们可以看出工程中没有链接swift基础动态库,我们只需要让工程链接swift基础动态库就可以了。

第一种方式(被动方式)

在工程中新建一个swift文件,里面什么都不用写,再编译就OK了。工程中有swift文件就会自动链接swift基础动态库。

第二种方式(主动方式)

创建xcconfig文件Config.xcconfig(名称随便起)。

未命名.png

为工程配置这个xcconfig文件:

未命名.png

在xcconfig文件中添加内容:

LIBRARY_SEARCH_PATHS = "${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift

好了,也可以正常调用了。

当然也可以不用xcconfig文件,直接在工程中配置:

未命名.png

这样直接在工程中配置与使用xcconfig文件配置是等价的。