Using Swift with Cocoa and Objective-C--在同个工程中使用Swift和在同个工程中

Swift与Objective-C的兼容能力允许你在同一个工程中同时使用两种语言。你可以用这种叫做“mix and match”的特性来开发基于混合语言的应用。使用Swfit的最新特性--“mix and match”,你可以实现应用的一部分功能,并无缝地并入已有的Objective-C的代码中。

Swift与Objective-C文件可以在一个工程中并存,不管这个工程原本是基于Objective-C还是Swift。你可以直接往现有工程中简单地添加另一种语言的文件。这种自然的工作流使得创建混合语言的应用或framework target,与用单独一种语言时一样简单。

编写混合语言的工作流程只有一点点区别,这取决于你是在写应用还是写框架。下面描述了用两种语言在一个target中导入模型的情况,后续章节会有更多细节。

在同一个App Target中进行代码导入

如果你在写混合语言的应用,可能需要用Swift代码访问Objective-C代码,或者反之。本章描述的流程适用于non-framework target。

将Objective-C导入Swift

要在同一个app target中导入Objective-C文件供Swift使用,你需要依赖Objective-C的桥接头文件(Objective-C bridging header)来暴露给 Swift。当你添加 Swift 文件到现有的Objective-C应用时,Xcode 会自动创建这些头文件,反之亦然。

如果你同意,Xcode 会在源文件创建的同时生成头文件,并用product的模块名加上 -Bridging-Header.h命名。关于 product 的模块名,详见 Naming Your Product Module。

你应该编辑这个头文件来对Swift暴露出Objective-C代码。

To import Objective-C code into Swift from the same target

1.在Objective-C桥接头文件中,导入任何你想暴露给 Swift 的头文件,例如:

OBJECTIVE-C


2.在Build Settings中,确保Objective-C桥接头文件的build setting是基于 Swfit 编译器,即Code Generation 含有头文件的路径。这个路径必须是头文件自身的路径,而不是它所在的目录。

这个路径应该是你工程的相对路径,类似 Info.plist 在 Build Settings 中指定的路径。在大多数情况下,你不需要修改这个设置。

在这个桥接头文件中列出的所有公开的Objective-C 头文件都会对 Swift 可见。之后当前 target 的所有 Swift 文件都可以使用这些头文件中的方法,不需要任何import语句。用 Swift 语法使用这些Objective-C代码,就像使用系统自带的类一样。

SWIFT


将 Swift 导入Objective-C

向Objective-C中导入Swift代码时,你依赖 Xcode 生成的头文件来向Objective-C暴露 Swift 代码。这个自动生成Objective-C头文件,声明了target 中所有 Swift 代码中定义的接口。可以把这个Objective-C头文件看作 Swift 代码的umbrella header。它以 product 模块名加 -Swift.h 来命名。关于 product 的模块名,详见 Naming Your Product Module。

你不需要做任何事情来生成这个头文件,只需要将它导入到你的Objective-C代码来使用它。注意这个头文件中的 Swift 接口包含了它所使用到的所有 Objc 类型。如果你在 Swift 代码中使用你自己的Objective-C类型,确保先将对应的 Objc 头文件导入到你的 Swift 代码中,然后才将 Swift 自动生成的头文件导入到 Objc .m 源文件中来访问 Swift 代码。

To import Swift code into Objective-C from the same target

在相同 target 的 Objc .m 源文件中,用下面的语法来导入Swift 代码:

OBJECTIVE-C


target 中任何 Swift 文件将会对 Objc .m 文件可见,包括这个 import 语句。关于在 Objc 代码中使用 Swift 代码,详见 Using Swift from Objective-C。


在同个Framework Target中导入代码

如果你在写一个混合语言的框架,可能会从 Swift 代码访问 Objc 代码,或者反之。

将 Objc 导入 Swift

要将一些 Objc 文件导入到同个框架 target 的 Swift 代码中去,你需要将这些文件导入到 Objc 的  umbrella header  来供框架使用。

To import Objective-C code into Swift from the same framework

确保将框架 target 的  Build Settings > Packaging > Defines Module  设置为  Yes 。然后在你的  umbrella header  头文件中导入你想暴露给 Swift 访问的 Objc 头文件,例如:

OBJECTIVE-C


Swift 将会看到所有你在  umbrella header  中公开暴露出来的头文件,框架 target 中的所有 Swift 文件都可以访问你 Objc 文件的内容,不需要任何 import 语句。

SWIFT


将 Swift 导入 Objc

要将一些 Swift 文件导入到同个框架的 target 的 Objc 代码去,你不需要导入任何东西到umbrella header文件,而是将 Xcode 为你的Swift代码自动生成的头文件导入到你的 Obj .m 源文件去,以便在 Objc 代码中访问 Swift 代码。

To import Swift code into Objective-C from the same framework

1.确保将框架target 的 Build Settings > Packaging  中的  Defines Module  设置为  Yes 。用下面的语法将 Swift 代码导入到同个框架 target 下的 Objc .m 源文件去。

OBJECTIVE-C


这个 import 语句所包含的 Swift 文件都可以被同个框架 target 下的 Objc .m 源文件访问。关于在 Objc 代码中使用 Swift 代码,详见 Using Swift from Objective-C。


导入外部 Framework

你可以导入外部框架,不管这个框架是纯 Objc,纯 Swift,还是混合语言的。import 外部框架的流程都是一样的,不管这个框架是用一种语言写的,还是包含两种语言。当你导入外部框架时,确保  Build Setting > Pakaging > Defines Module  设置为  Yes 。

用下面的语法将框架导入到不同 target 的 Swift 文件中:

SWIFT


用下面的语法将框架导入到不同 target 的 Objc .m 文件中:

OBJECTIVE-C


在Objective-C中使用 Swift

当你将 Swift 代码导入 Objc 文件之后,用普通的 Objc 语法使用 Swift 类。

OBJECTIVE-C


Swift 的类或协议必须用  @objc attribute  来标记,以便在 Objc 中可访问。这个 attribute 告诉编译器这个 Swift 代码可以从 Objc 代码中访问。如果你的 Swift 类是 Objc 类的子类,编译器会自动为你添加  @objc attribute 。详见 Swift Type Compatibility。

你可以访问 Swift 类或协议中用  @objc attribute  标记过东西,只要它和 Objc 兼容。不包括一下这些 Swift 独有的特性:

Generics - 范型

Tuples - 元组

Enumerations defined in Swift - Swift 中定义的枚举

Structures defined in Swift - Swift 中定义的结构体

Top-level functions defined in Swift - Swift Swift 中定义的顶层函数

Global variables defined in Swift - Swift 中定义的全局变量

Typealiases defined in Swift - Swift 中定义的类型别名

Swift-style variadics

Nested types - 嵌套类型

Curried functions - 柯里化后的函数

例如带有范型类型作为参数,或者返回元组的方法不能在Objective-C中使用。

为了避免循环引用,不要将 Swift 代码导入到Objective-C头文件中。但是你可以在Objective-C头文件中前向声明( forward declare )一个 Swift 类来使用它,然而,注意不能在Objective-C中继承一个 Swift 类。

To reference a Swift class in an Objective-C header file

这样前向声明 Swift 类:

OBJECTIVE-C


Product Module命名

Xcode 为 Swift 代码生成的头文件的名称,以及 Xcode 创建的 Objc 桥接头文件名称,都是从你的 product 模块名生成的。默认你的 product 模块名和 product 名一样。然而,如果你的 product 名有特殊字符(nonalphanumeric,非数字、字母的字符),例如点号,那么它们会被下划线( _ )替换之后作为你的 product 模块名。如果 product 名以数字开头,那么第一个数字会用下划线替换掉。

你可以给 product 模块名提供一个自定义的名称,Xcode 会用这个名称来命名桥接的和自动生成的头文件。你只需要在修改在  build setting  中的  Product Module Name  即可。

故障建议和提醒

•把 Swift 和 Objc 文件看作相同的代码集合,并注意命名冲突;

•如果你用框架,确保  Build Setting > Pakaging > Defines Module  设置为  Yes ;

•如果你使用 Objc 桥接头文件,确保在  Build Settings  中 Objc 桥接头文件的  build setting  是基于 Swfit 编译器,即  Code Generation  含有头文件的路径。这个路径必须是头文件自身的路径,而不是它所在的目录。

•Xcode 使用你的 product 模块名,而不是 target 名来命名 Objc 桥接头文件和为 Swift 自动生成的头文件。详见 Naming Your Product Module;

•为了在 Objc 中可用, Swift 类必须是 Objc 类的子类,或者用  @objc  标记;

•当你将 Swift 导入到 Objc 中时,记住 Objc 不会将 Swift 独有的特性翻译成 Objc 对应的特性。详见列表 Using Swift from Objective-C;

•如果你在 Swift 代码中使用你自己的 Objc 类型,确保先将对应的 Objc 头文件导入到你的 Swift 代码中,然后才将 Swift 自动生成的头文件 import 到 Objc .m 源文件中来访问 Swift 代码。


上图为2017年最新的视频教程资料,搜索2352149755加我好友私聊我上传视频教程,有什么不懂的也可以来私聊问我。

不定时更新中。

如果你能明白这些视频资料的好差,那么你也算是入行了,底层和中高层就是这一步之差。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,948评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,371评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,490评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,521评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,627评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,842评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,997评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,741评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,203评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,534评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,673评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,339评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,955评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,770评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,000评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,394评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,562评论 2 349

推荐阅读更多精彩内容