OC 与 Swift 混编配置

混编也无非两种情况:

◦在Objective - C工程或者文件使用Swift的文件;

◦在Swift工程或者文件使用Objective - C文件 在混编的过程中最重要的两个文件:

*1.桥接文件:*

桥接文件“ProjectName-Bridging-Header.h”,在首次创建其他文件的时候,会自动生成。如果不小心删除后,也可以手动添加,不过名字必须是“ProjectName-Bridging-Header.h”头文件(名称组成:工程名-Bridging-Header.h),如果名字记不清也可以自己新建Header file后,在Targets–>Build Settings–>Swift Compiler - General–>Objective-C Bridging Header配置文件路径,这个文件主要是Swift使用OC类时使用。

2.Objective-C Generated Interface Header Name文件

这个文件是混编时,系统生成的Swift文件对应的Objective-C的头文件,具体可以在Targets–>Build Settings–>Swift Compiler - General–>Objective-C Generated Interface Header Name进行配置,默认文件名是工程名-Swift.h,一般不做改动。
在Objective - C工程或者文件使用Swift的文件

当在OC文件中调用Swift文件中的类的时候,首先在OC文件中要加上 #import “
ProjectName-swift.h”(名字组成:工程名-swift)

这个文件虽然在工程中看不到,但是她真实存在,编译后,你可以按住Command+单击该文件名,就会看到具体生成的代码。

引入后,具体类的使用,直接按照OC的方式使用即可。
在Swift工程或者文件使用Objective - C文件

当在Swift中使用OC文件的时候,只需在桥接文件即projectName-Bridging-Header.h文件中引入需要的头文件。
具体使用,按照对应的Swift语法结构来即可。
混编注意事项

对于需要混编的Swift类添加@objc声明或继承NSObject或NSObject的子类

class TestClass
{
// 属性
// 实现
}

Objectiv

e-C类中使用TestClass类,应当使用@objc加以声明,或者将TestClass继承自NSObject或NSObject的子类,否则,引入ProductName-Swift.h之后,程序找不到对应类。

使用第三方Framework

◦设置: target–>build setting –>Packaging –>Defines Module为 “Yes”;

◦然后,配置文件Target -> Build Phases -> Link Binary,添加要导入的Framework;

◦最后,还是要配置桥接文件,比如要使用 abc-lib.framework库中的 abc.h
就要这样配置:#import”abc-lib/abc.h”;

Subclass子类问题

对于自定义的类而言,Objective-C的类,不能继承自Swift的类,即要混编的OC类不能是Swift类的子类。反过来,需要混编的Swift类可以继承自OC的类。 注解
OC宏文件

如Swift文件要使用OC中定义的宏,只能使用常量简单宏文件。
Swift独有特性

Swift中有许多OC没有的特性,比如,Swift有元组、为一等公民的函数、还有特有的枚举类型。所以,要使用的混编文件要注意Swift独有属性问题。
案例之Swift中使用OC的block

Swift中使用Closure不能使用Block作为属性进行传值,必须是初始化方法或函数。
Objective-C文件中:

import typedef void (^Myblock)(NSString *arg);

@interface FirViewController : UIViewController
 //@property (copy, nonatomic) Myblock myBlock;
 //这种作为公共参数的形式,如果在Swift类中去回调的话,是有问题的。提示没有初始化方法,所以使用下面的以Block为参数的方法
 - (void)transValue:(Myblock) block;

@end

下面是.m文件

“FirViewController.h”

@implementation FirViewController

-(void)viewDidLoad
{
[super viewDidLoad];
self.view.backgroundColor = [UIColor whiteColor];
}
-(void)transValue:(Myblock)block
{
if (block)
{
block(@"firBack");
}
}
@end

在Swift文件回调:
在Swift使用OC的类时,首先在桥接文件中声明oc的头文件
工程名-Bridging-Header.h这是创建Swift工程的情况下

import UIKit
class ViewController: UIViewController
{
override func viewDidLoad()
{
super.viewDidLoad()
self.view.backgroundColor = UIColor.whiteColor()
}
@IBOutlet weak var goFirst: UIButton!
@IBAction func goFirstAction(sender: AnyObject)
{
let firVC:FirViewController = FirViewController()
firVC. transValue { ( arg:String !) -> Void in
self.aBtn?.setTitle(arg, forState: UIControlState.Normal)
}
self.navigationController?.pushViewController(firVC, animated: true)

(其实做为一个开发者,有一个学习的氛围跟一个交流圈子特别重要,这是一个我的iOS学习交流群687528266,不管你是小白还是大牛欢迎入驻,大家一起交流学习,加群私聊群主就可以领取2018最全梳理的面试宝典和资料)以及下方资料这份资料,希望对你有所帮助

(1)底层原理分析资料
(2)面试必问底层技术资料
(3)开发过程中的加密底层实现
(4 )开发实战框架-RAC 与 RXSwift
(5)音视频开发与直播技术
(6) AR 特效开发与底层原 理
(7)常用框架底层原理分析
(8)最新分享+面试题解析
(9)网络多线程+GCD底层详解
(10)断点续传 特训

猜你喜欢

转载自blog.csdn.net/ping20/article/details/80602232