一、Swift文件间相互调用时,Swift中的几个权限描述关键字
1> internal : 内部的
1 | 1. 默认情况下所有的类&属性&方法的访问权限都是internal |
2> private : 私有的
1 | 1. 只有在本类中可以访问 |
3> open : 公开的
1 | 1. 可以跨模块(项目/包/target)都是可以访问 |
4> fileprivate : Swift3.0
1 | 1. 只要是在本文件中都是可以进行访问 |
二、Objc和Swift间相互调用时,Objc中如何调用Swift类及方法
Objc和Swift混编时,需要建立桥接头文件(此文件供Swift调用OC类时使用)。另外,Xcode还会在 编译时 默认生成一个Swift桥接文件 ProjectName-Swift.h。
Swift4.0 之前,OC类中直接导入桥接头文件,就能访问到 Swift 类及方法,但是 Swift4.0 之后,为了降低不必要的编译性能损耗,Xcode中默认不再将所有的Swift类及方法暴露给OC。
我们需要在要暴露的类和文件前加上 @objc 关键字,如下所示:
1 | // 如果此类要暴露给OC使用,则必须继承于OC类(例如NSObject),此时前面写不写 @objc 都可以 |
三、扩展:Objc和Swift混编时如何互相调用
将 Objective-C 代码导入到 Swift 中
为了在同一个 App Target 下 导入 Objc 文件到 Swift 代码中,你以来 Objc 桥接 header 来将这些文件暴露给 Swift。Xcode 在你将 Swift 文件添加进 Objc App 或者将 Objc 文件添加到 Swift App 时会提供创建这样一个头文件。
如果你接受了,Xcode 就会创建这个头文件并且以 Product Module 名字 + “-Bridging-Header.h” 的形式来新建。
你也可以自己通过 File > New > File > (iOS, watchOS, tvOS, _or_ macOS) > Source > Header File. 的方式来添加
你需要编辑这个桥接头文件来把 Objc 代码暴露给 Swift 代码。
同一个 Target 下把 Objective-C 代码 import 到 Swift 中
在 Objc 桥接头文件中,import 每一个你想要暴露给 Swift 的头文件,例如:
#import "XYZCustomCell.h"
#import "XYZCustomView.h"
#import "XYZCustomViewController.h"
在 Swift Compiler - Code Generation 中,确保 Objc Bridging Header 设置下有一个指向 Bridging Header File 的路径。
这个路径需要是相对的,类似于在 info.plist 文件中指定的形式。多数情况下你不需要修改这个设置。
任何公共的 Objc 头文件都需要罗列在这个桥接文件中。Objc 功能会自动在 Target 中在任何的 Swift 文件中可用。而且不需要再 import 声明。
let myCell = XYZCustomCell()
myCell.subtitle = "A custom cell"
总结:
1. Xcode 会在你试图做混合开发的时候,自动创建一个 Product Module 名字 + “-Bridging-Header.h”的文件
2. 在这个文件中导入你想要访问的 Objc 头文件
3.在 Swift 文件中就可以访问到 Objc 文件中的方法
将 Swift 代码导入到 Objective-C 中
当你把 Swift 代码 import 到 Objective-C 中时,你依赖的是 Xcode 产生的 Header File 来把这些文件暴露给 Objective-C。这个自动生成的文件是一个 Objective-C 头文件声明了你 Target 中的 Swift 接口。这个头文件的名称就是产品模块名称加上 - Swift.h 后缀。
注意:不论你初始创建的是 Swift 还是 Objective-C 的工程,其实 Xcode 都已经为你自动创建好了这个头文件。不过有的时候需要反复 Clean 几次后再 Build 才能编译上。否则会运行时出错。
同一个 Target 下把 Swift 代码 import 到 Objective-C 中
要在同一个 Target 下的 Swift 代码导入到任何 Objective-C 类中。使用下面语法修改其 .m文件:
#import "ProductModuleName-Swift.h" 在你想要访问Swift的某个 Objc 文件中首先 import 这个自动生成的头文件。然后就可以访问对应的 Swift 中的方法了。
在 .m文件中导入桥接头文件后,Target 中的 Swift 文件将在 Objective-C 中可见,并且能在 OC文件中调用Swift代码(Swift4.0 及之后版本对此作了改动,只能在OC文件中显示和调用被 @objc 修饰的Swift类和方法)。
总结:
1. 不论初始创建的什么类型的工程,Xcode 已经自动创建好了"ProductModuleName-Swift.h"
的头文件
2. 只要在需要使用 Swift 的 Objc 文件中 import 这个自动生成的头文件就可以访问 Swift 中的方法了
3. Swift 中的类最终必须集成于 NSObject, 否则调用时运行出错
4. 自动生成的这个头文件可能需要一定时间生成,因此会出现访问不到的情况,需要多次 clean 后编译