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里面也要告知加上 !!
- demo和静态库是同一台电脑开发的,demo里的静态库崩溃。demo可以看到静态库崩溃部分的源码。 换电脑则不会。
完毕!