Fork me on GitHub

Swift访问权限

一、Swift文件间相互调用时,Swift中的几个权限描述关键字

1> internal : 内部的

1
2
1. 默认情况下所有的类&属性&方法的访问权限都是internal
2. 在本模块(项目/包/target)中可以访问

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
2
3
4
5
6
7
8
9
10
// 如果此类要暴露给OC使用,则必须继承于OC类(例如NSObject),此时前面写不写 @objc 都可以
@objc
open class MyClass: NSObject {

@objc
open class func foo() -> Void {

print("Swift")
}
}

三、扩展: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 中

  1. 在 Objc 桥接头文件中,import 每一个你想要暴露给 Swift 的头文件,例如:

    1. #import "XYZCustomCell.h"
    2. #import "XYZCustomView.h"
    3. #import "XYZCustomViewController.h"
  2. 在 Swift Compiler - Code Generation 中,确保 Objc Bridging Header 设置下有一个指向 Bridging Header File 的路径。

    这个路径需要是相对的,类似于在 info.plist 文件中指定的形式。多数情况下你不需要修改这个设置。

任何公共的 Objc 头文件都需要罗列在这个桥接文件中。Objc 功能会自动在 Target 中在任何的 Swift 文件中可用。而且不需要再 import 声明。

  1. let myCell = XYZCustomCell()
  2. 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 后编译

------------- 本文结束感谢您的阅读 -------------