Swift和Objective-C 混编注意事项整理:
前言
Swift已推出数年,与Objective-C相比Swift的语言机制及使用简易程度上更接地气,大大降低了iOS入门门槛。当然这对新入行的童鞋没来讲,的确算是福音,但对于整个iOS编程从业者来讲,真真是,曾几何时“高大上”,转瞬之间“矮矬穷”。再加上培训班横行,批量批发之下,iOS再也看不到当年的辉煌。iOS10推出后,紧跟着Xcode8也推送了更新,细心者会发现,Xcode8下iOS版本最低适配已变为iOS8.0,加上Swift版本趋于稳定,从某种意义上讲,Swift的时代正式开启,替代Objective-C怕也只是时间问题。当然,在这之前,我们也应做好准备。今年越来的越多的公司,也开始了Swift和Objective-C混编。
我们今天就来看看两者混编中的一些注意事项及问题:
混编
混编也无非两种情况,
在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 { // 属性 // 实现 }
如果要在Objective-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 <UIKit/UIKit.h> typedef void (^Myblock)(NSString *arg); @interface FirViewController : UIViewController //@property (copy, nonatomic) Myblock myBlock; //这种作为公共参数的形式,如果在Swift类中去回调的话,是有问题的。提示没有初始化方法,所以使用下面的以Block为参数的方法 - (void)transValue:(Myblock) block; @end
下面是.m文件
#import "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) }
Swift和Objective-C语言的混编就分享这么多,希望大神给出宝贵的意见!(@。ε。@)
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
问题内容: 我有一个这样的: 但我想将其转换为: 我怎样才能做到这一点? 问题答案: 逃避想要的角色还需要做更多的工作。 范例程式码 iOS7及以上: NSLog输出: escapedString:http%3A%2F%2Fwww 以下是有用的URL编码字符集: 创建一个结合以上所有内容的角色集: 创建一个Base64 对于Base64字符集: 对于Swift 3.0: 对于Swift 2.x:
本文向大家介绍Swift、Objective-C、Cocoa混合编程设置指南,包括了Swift、Objective-C、Cocoa混合编程设置指南的使用技巧和注意事项,需要的朋友参考一下 Swift 被设计用来无缝兼容 Cocoa 和 Objective-C 。在 Swift 中,你可以使用 Objective-C 的 API(包括系统框架和你自定义的代码),你也可以在 Objective-C中
本文向大家介绍在Swift中使用Objective-C编写类、继承Objective-C类,包括了在Swift中使用Objective-C编写类、继承Objective-C类的使用技巧和注意事项,需要的朋友参考一下 互用性(互操作性)使开发者可以定义融合了 Objective-C 语言特性的Swift类。编写 Swift 类时,不仅可以继承 Objective-C 语言编写的父类,采用 Objec
在Swift中,转义闭包参数用注释。Objective-C中是否有任何等效项,以便生成的Swift接口将标记为?
本文向大家介绍在一个项目中同时使用Swift和Objective-C代码混合编程的方法,包括了在一个项目中同时使用Swift和Objective-C代码混合编程的方法的使用技巧和注意事项,需要的朋友参考一下 Swift 与 Objective-C 的兼容能力使你可以在同一个工程中同时使用两种语言。你可以用这种叫做 mix and match 的特性来开发基于混合语言的应用,可以用 Swfit 的最
DaoCloud 账号的注册 感谢您对 DaoCloud 的关注和支持,本文将带您一步一步地加入到 DaoCloud 的大家庭中。希望您能通过 DaoCloud 快速地学习并灵活地使用 Docker 进行项目代码的开发、测试和部署。 在使用 DaoCloud 提供的优质服务之前,您需要先注册一个属于您或您的团队的 DaoCloud 账号。DaoCloud 十分重视用户体验的简易性和灵活性,所以我们