Swift制作Framwork,Framework包含Swift文件和Objective-C文件

第一部分,比较原始的方法,缺点是暴露了不想暴露的Objective-C文件

1.创建一个新的Swift项目:Example
2.选中Target,点击左下角的"+"创建一个新的Target:MyFramework

3.给MyFramework各建立一个OC类和Swift类,注意我们的Swift文件是要作为公开文件暴露给Example使用,需要增加public/open修饰

@interface ObjectOC : NSObject

- (void)testOC:(NSString *)name;
@end

@implementation ObjectOC

- (void)testOC:(NSString *)name {
    NSLog(@"OC ----%@",name);
}
@end

public class ObjectSwift: NSObject {
    public override init() {
        
    }
    
    public func testSwift(name:String) {
        print("Swift ----\(name)")
    }
}

4.MyFramework.h里面 #import <MyFramework/ObjectOC.h>
编译发现报错

Include of non-modular header inside framework module.........

解决办法之一:把ObjectOC.h拖入到公开文件,但是这样我们就暴露了ObjectOC.h,不太好。

然后就可以在Swift类中调用OC类

public class ObjectSwift: NSObject {
    public override init() {
        let oc = ObjectOC()
        oc.test("232323")
    }
    public func testSwift(name:String) {
        print("Swift ----\(name)")
    }
}

OC类调用Swift类,只需#import <MyFramework/MyFramework-Swift.h>

#import "ObjectOC.h"
#import <MyFramework/MyFramework-Swift.h>

@implementation ObjectOC

- (void)testOC:(NSString *)name {
    NSLog(@"OC ----%@",name);
}

- (void)test {
    ObjectSwift *sw = [[ObjectSwift alloc] init];
    NSLog(@"%@",sw);
}
@end

如果需要静态库,则在build Setting 里面修改Mach-O Type即可

第二部分,使用module.modulemap来引用OC类,当然也可以引用C文件

1.创建module.modulemap文件(可以先创建swift文件,修改后缀即可),并且为了测试多个文件,在我们上面的工程中新增一个OC类TestOC。

2.Build Setting 搜索 Import Paths 增加路径 $(SRCROOT)/MyFramework/ 这是module.modulemap所在的路径(如果找不到Import Paths,新建swift文件后编译一遍就有了)
3.移除Headers - Public -下面的ObjectOC.h文件
4.MyFramework.h里面也不再需要 #import <MyFramework/ObjectOC.h>
5.使用到的地方 直接import即可

import UIKit
import ObjectOC
import TestOC

public class ObjectSwift: NSObject {
    public override init() {
        let oc = ObjectOC()
        oc.test("232323")
        
        let test = TestOC()
        print(test)
        
    }
    public func testSwift(name:String) {
        print("Swift ----\(name)")
    }
}

总结

要注意的点
1.module.modulemap最好直接放到Framework路径下;前面例子就是MyFramework下面,是为了路径定位方便
2.Build Setting里面的路径是module.modulemap所在的路径,最后不要忘记加/;
3.header的路径要保证能准确找到头文件,如果有文件夹嵌套,要写清楚。
4.如过你选择的是静态库,也就是Mach-O Type选择的是Static Library ,那么OC的Category函数,使用module调用会报找不到函数的错误。
unrecognized selector sent to instance

主项目工程(不是静态库工程) target,更改其Other Linker Flags为: -all_load -ObjC

需要注意的是 sdk里面修改了 demo里面也要告知加上 !!
  1. demo和静态库是同一台电脑开发的,demo里的静态库崩溃。demo可以看到静态库崩溃部分的源码。 换电脑则不会。
    完毕!
posted @ 2020-05-26 15:33  yxg889  阅读(598)  评论(0编辑  收藏  举报