参考资料
@H_403_7@
- 从Objective-C到Swift
- swift与objective-c混编
- Swift and Objective-C in the Same ProjectSwift类引用Objective-C文件
因为Swift没有内嵌的头文件机制,因此Swift调用Objective-C需要一个名为“<工程名>-Bridging-Header.h”的桥接头文件。桥接头文件的作用是为Swift调用Objective-C对象搭建一个桥,它的命名必须是“<工程名>- Bridging-Header.h”,我们需要在桥接头文件中引入Objective-C头文件,所有的Swift类会自动引用这个头文件。
- OJC类如下:
// // ObjcFunc.h // CombinedProgram // // Created by apple on 15/7/1. // Copyright (c) 2015年 hoteam. All rights reserved. // #import <Foundation/Foundation.h> @interface ObjcFunc : NSObject -(NSString*)sayHello:(NSString*)greeting withName: (NSString*)name; @end // // ObjcFunc.m // CombinedProgram // // Created by apple on 15/7/1. // Copyright (c) 2015年 hoteam. All rights reserved. // #import "ObjcFunc.h" #import "CombinedProgram-Swift.h" @implementation ObjcFunc - (NSString*)sayHello:(NSString*)greeting withName: (NSString*)name{ NSString *string = [NSString stringWithFormat:@"Hi,%@ %@.",name,greeting]; return string; } @end
- Swift类中调用
import Foundation @objc class SwiftFunc: NSObject { func sayHello() -> Void { var obj : ObjcFunc = ObjcFunc() println(obj.sayHello("Hello",withName: "Swift")); return } }
Objective-C类引用Swift文件
(1)在Building Settings -> Packaging -> Defining中选定Module Name;
(2)在OJC的头文件中引入:#import "{ModuleName}-swift.h"
SwiftFunc* obj = [[SwiftFunc alloc] init]; [obj sayHello];
有时候会发现Xcode无法自动生成*-Swift.h文件,可以参考StackOverflow上的这篇文章。该文章总结下来,我们需要进行以下两大步检测:
(1)检测你的Xcode的配置Product Module Name : myproject Defines Module : YES Embedded Content Contains Swift : YES Install Objective-C Compatibility Header : YES sObjective-C Bridging Header : $(SRCROOT)/Sources/SwiftBridging.h
(2)检查你的Swift类是否正规 要保证你的Swfit类中已经使用@objc关键字声明了一个继承自NSObject的类。Xcode不会为存在任何编译错误的类进行编译操作。 (3)忽略Xcode的报错,先编译一下