IOS面试题——Swift访问控制(14)

一 面试题汇总

  1. Swift访问控制有哪几种访问级别?分别是什么?
  2. 访问级别的使用准则?一个实体不可以被更低访问级别的实体定义
  3. 元组类型,泛型类型的访问级别如何确定?
  4. 类型的访问级别对其成员,嵌套类型的影响?
  5. 子类重写成员的访问级别有什么限制? ≥ 子类的访问级别,或者 ≥ 父类被重写成员的访问级别
  6. 协议定义的方法,枚举类型的case等是否能单独设置访问级别?
  7. public类的默认初始化器是internal级别。如果一个public类想在另一个模块调用编译生成的默认无参初始化器,必须显式提供public的无参初始化器

二 面试题解答(仅供参考)

2.1 Swift访问控制有哪几种访问级别?分别是什么?

1
2
3
4
5
6
7
8
9
在 Swift 中,访问控制有五种访问级别,分别是:

1.open:允许在模块外部访问和子类化,能够在模块外部继承和重写类及其成员。
2.public:允许在模块外部访问,但不能被子类化或重写。只能访问公共接口,但不能修改实现。
3.internal(默认级别):允许在同一模块内访问,但不能在模块外部访问。
4.fileprivate:只允许在当前文件内访问。
5.private:只允许在当前声明范围内访问,限制最严格。

这些访问级别使得开发者可以精细地控制代码的可见性和使用权限。

2.2 访问级别的使用准则?一个实体不可以被更低访问级别的实体定义

1
2
3
4
5
6
7
8
9
10
11
12
13
14
在 Swift 中,访问级别的使用准则如下:

1.实体访问级别不能低于其成员访问级别:
即一个实体(例如类、结构体、枚举、协议)不能被更低访问级别的实体所定义。
举个例子,如果你有一个 public 类,它的成员不能是 private,否则会导致访问控制不一致的错误。

2.访问级别原则:
每个实体的访问级别应当根据其需要对外暴露的程度来设置。
一般来说,实体应当设置为尽可能低的访问级别,从而减少暴露的接口,增加模块的封装性和安全性。

3.外部代码访问级别限制:
即使某个实体的访问级别设置为 open 或 public,
其内部成员(如属性、方法、构造函数等)的访问级别也应当合理设置,
以保证只暴露必要的部分给外部代码,避免不必要的暴露。

2.3 元组类型,泛型类型的访问级别如何确定?

1
2
3
4
5
6
在 Swift 中,元组类型和泛型类型的访问级别遵循「最严格访问级别」的原则:

1-元组类型:元组的访问级别由元组内所有类型中最低的访问级别决定。
2-泛型类型:泛型类型的访问级别由泛型类型本身和泛型参数类型中最低的访问级别决定。

总结:元组和泛型的访问级别,取决于其内部所有组成部分的最低访问级别!

2.4 类型的访问级别对其成员,嵌套类型的影响?

1
2
3
4
5
6
7
8
9
10
11
12
在 Swift 中,类型的访问级别会影响其成员和嵌套类型的默认访问级别,但它们可以单独设置,需遵循以下规则:

1-成员访问级别:
1.1-类型的访问级别决定了其成员(属性、方法、构造器等)的默认访问级别。
1.2-如果没有明确指定,成员的访问级别默认与类型一致。
1.3-成员的访问级别不能高于所属类型的访问级别。

2-嵌套类型访问级别:
2.1-嵌套类型的默认访问级别与外部类型一致,但可以单独设置。
2.2-嵌套类型的访问级别也不能高于外部类型。

总结:类型的访问级别对成员和嵌套类型的默认级别有影响,但它们可以被手动设置,且访问级别不能超过外部类型。

2.5 子类重写成员的访问级别有什么限制? ≥ 子类的访问级别,或者 ≥ 父类被重写成员的访问级别

1
2
3
4
5
6
在 Swift 中,子类重写成员的访问级别有以下限制:

1.不能低于子类本身的访问级别:重写的成员访问级别至少要与子类的访问级别相同,不能更低
2.不能低于父类被重写成员的访问级别:重写的成员访问级别至少要与父类的被重写成员访问级别一致,或更高。

总结:子类重写的成员访问级别必须 ≥ 子类自身的访问级别,且 ≥ 父类被重写成员的访问级别。

2.6 协议定义的方法,枚举类型的case等是否能单独设置访问级别?

1
协议的方法、枚举的 case 访问级别,都会跟随它们所属的协议或枚举,无法单独设置。

2.7 public类的默认初始化器是internal级别。如果一个public类想在另一个模块调用编译生成的默认无参初始化器,必须显式提供public的无参初始化器

1
2
3
总结:
1.默认情况下,public 类不会自动生成 public 的初始化器。
2.若需跨模块访问,必须手动写明 public init()。

三 参考

  • 简书—Swift访问控制