- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Swift和Objective-C 混编注意事项由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
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的子类 。
1
2
3
4
5
6
7
|
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文件中:
1
2
3
4
5
6
7
8
9
10
11
|
#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文件 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
#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工程的情况下 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
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语言的混编就分享这么多,希望大神给出宝贵的意见!(@。ε。@) 。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持! 。
最后此篇关于Swift和Objective-C 混编注意事项的文章就讲到这里了,如果你想了解更多关于Swift和Objective-C 混编注意事项的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我遵循了一本名为“Sitepoint Full Stack Javascript with MEAN”的书中的教程,我刚刚完成了第 6 章,应该已经创建了一个带有“数据库”的“服务器”。数据库只不过是
在 Jquery 中,我创建两个数组,一个嵌入另一个数组,就像这样...... arrayOne = [{name:'a',value:1}, {name:'b',value:2}] var arra
这个问题在这里已经有了答案: What is the explanation for these bizarre JavaScript behaviours mentioned in the 'Wa
我被放在别人的代码上,有一个类用作其他组件的基础。当我尝试 ng serve --aot(或 build --prod)时,我得到以下信息。 @Component({ ...,
我正在测试一些代码,并使用数据创建了一个 json 文件。 问题是我在警报中收到“[object Object],[object Object]”。没有数据。 我做错了什么? 这是代码:
我想打印 [object Object],[object Object] 以明智地 "[[{ 'x': '1', 'y': '0' }, { 'x': '2', 'y': '1' }]]"; 在 ja
我有一个功能 View ,我正在尝试以特殊格式的方式输出。但我无法让列表功能正常工作。 我得到的唯一返回是[object Object][object Object] [object Object]
在使用优秀的 Sim.js 和 Three.js 库处理 WebGL 项目时,我偶然发现了下一个问题: 一路走来,它使用了 THREE.Ray 的下一个构造函数: var ray = new THRE
我正在使用 Material UI 进行多重选择。这是我的代码。 {listStates.map(col => (
我的代码使用ajax: $("#keyword").keyup(function() { var keyword = $("#keyword").val(); if (keyword.
我遇到了下一个错误,无法理解如何解决它。 Can't resolve all parameters for AuthenticationService: ([object Object], ?, [o
我正在尝试创建一个显示动态复选框的表单,至少应选中其中一个才能继续。我还需要获取一组选中的复选框。 这是组件的代码: import { Component, OnInit } from '@angul
我正在开发 NodeJs 应用程序,它是博客应用程序。我使用了快速验证器,我尝试在 UI 端使用快速闪存消息将帖子保存在数据库中之前使用闪存消息验证数据,我成功地将数据保存在数据库中,但在提交表单后消
我知道有些人问了同样的问题并得到了解答。我已经查看了所有这些,但仍然无法解决我的问题。我有一个 jquery snipet,它将值发送到处理程序,处理程序处理来自 JS 的值并将数据作为 JSON 数
我继承了一个非常草率的项目,我的任务是解释为什么它不好。我注意到他们在整个代码中都进行了这样的比较 (IQueryable).FirstOrDefault(x => x.Facility == fac
我只是在删除数组中的对象时偶然发现了这一点。 代码如下: friends = []; friends.push( { a: 'Nexus', b: 'Muffi
这两个代码片段有什么区别: object = nil; [object release] 对比 [object release]; object = nil; 哪个是最佳实践? 最佳答案 object
我应该为其他人将从中继承的第一个父对象传递哪个参数,哪个参数更有效 Object.create(Object.prototype) Object.create(Object) Object.creat
我在不同的对象上安排不同的选择器 [self performSelector:@selector(doSmth) withObject:objectA afterDelay:1]; [self per
NSLog(@"%p", &object); 和 NSLog(@"%p", object); 有什么区别? 两者似乎都打印出一个内存地址,但我不确定哪个是对象的实际内存地址。 最佳答案 这就是我喜欢的
我是一名优秀的程序员,十分优秀!