在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
访问控制可以限定你在源文件或模块中访问代码的级别,也就是说可以控制哪些代码你可以访问,哪些代码你不能访问。这个特性可以让我们隐藏功能实现的一些细节,并且可以明确的指定我们提供给其他人的接口中哪些部分是他们可以使用的,哪些是他们看不到的。 你可以明确的给类、结构体、枚举、设置访问级别,也可以给属性、函数、初始化方法、基本类型、下标索引等设置访问级别。协议也可以被限定在一定的范围内使用,包括协议里的全局常量、变量和函数。 在提供了不同访问级别的同时,Swift 并没有规定我们要在任何时候都要在代码中明确指定访问级别。其实,如果我们作为独立开发者在开发我们自己的 app,而不是在开发一些
模块和源文件Swift 中的访问控制模型基于模块和源文件这两个概念。 模块指的是 在 Swift 中, 源文件指的是 Swift 中的 访问级别Swift 提供了三种不同的访问级别。这些访问级别相对于源文件中定义的实体,同时也相对于这些源文件所属的模块。
访问级别的使用原则在 Swift 中,访问级别有如下使用原则:访问级别统一性。 比如说:
默认访问级别代码中的所有实体,如果你不明确的定义其访问级别,那么它们默认为 单目标应用程序的访问级别当你编写一个单目标应用程序时,该应用的所有功能都是为该应用服务,不需要提供给其他应用或者模块使用,所以我们不需要明确设置访问级别,使用默认的访问级别 Framework的访问级别当你开发
访问控制语法通过修饰符 public class SomePublicClass {}
internal class SomeInternalClass {}
private class SomePrivateClass {}
public var somePublicVariable = 0
internal let someInternalConstant = 0
private func somePrivateFunction() {}
除非有特殊的说明,否则实体都使用默认的访问级别 class SomeInternalClass {} // 隐式访问级别 internal
var someInternalConstant = 0 // 隐式访问级别 internal
自定义类型如果你想为一个自定义类型指定一个明确的访问级别,那么你要明确一点。那就是你要确保新类型的访问级别和它实际的作用域相匹配。比如说,如果某个类里的属性、函数、返回值它们的作用域仅在当前的源文件中,那么你就可以将这个类申明为 类的访问级别也可以影响到类成员(属性、函数、初始化方法等)的默认访问级别。如果你将类申明为
public class SomePublicClass { // 显示的 public 类
public var somePublicProperty = 0 // 显示的 public 类成员
var someInternalProperty = 0 // 隐式的 internal 类成员
private func somePrivateMethod() {} // 显示的 private 类成员
}
class SomeInternalClass { // 隐式的 internal 类
var someInternalProperty = 0 // 隐式的 internal 类成员
private func somePrivateMethod() {} // 显示的 private 类成员
}
private class SomePrivateClass { // 显示的 private 类
var somePrivateProperty = 0 // 隐式的 private 类成员
func somePrivateMethod() {} // 隐式的 private 类成员
}
元组类型元组的访问级别使用是所有类型的访问级别使用中最为严谨的。比如说,如果你构建一个包含两种不同类型元素的元组,其中一个元素类型的访问级别为
函数类型函数的访问级别需要根据该函数的参数类型访问级别、返回类型访问级别得出。如果根据参数类型和返回类型得出的函数访问级别不符合上下文,那么就需要明确的申明该函数的访问级别。 下面的例子中定义了一个全局函数名为 func someFunction() -> (SomeInternalClass, SomePrivateClass) {
// function implementation goes here
}
我们可以看到,这个函数的返回类型是一个元组,该元组中包含两个自定义的类(可查阅自定义类型)。其中一个类的访问级别是 因为该函数返回类型的访问级别是 private func someFunction() -> (SomeInternalClass, SomePrivateClass) {
// function implementation goes here
}
将该函数申明为 枚举类型枚举中成员的访问级别继承自该枚举,你不能为枚举中的成员指定访问级别。 比如下面的例子,枚举 public enum CompassPoint {
case North
case South
case East
case West
}
原始值和关联值用于枚举定义中的任何原始值,或关联的值类型必须有一个访问级别,至少要高于枚举的访问级别。比如说,你不能在一个 嵌套类型如果在 子类子类的访问级别不得高于父类的访问级别。比如说,父类的访问级别是 此外,在满足子类不高于父类访问级别以及遵循各访问级别作用域(即模块或源文件)的前提下,你可以重写任意类成员(方法、属性、初始化方法、下标索引等)。 如果我们无法直接访问某个类中的属性或函数等,那么可以继承该类,从而可以更容易的访问到该类的类成员。下面的例子中,类 public class A {
private func someMethod() {}
}
internal class B: A {
override internal func someMethod() {}
}
只要满足子类不高于父类访问级别以及遵循各访问级别作用域的前提下(即 public class A {
private func someMethod() {}
}
internal class B: A {
override internal func someMethod() {
super.someMethod()
}
}
因为父类 常量、变量、属性、下标常量、变量、属性不能拥有比它们的类型更高的访问级别。比如说,你定义一个 如果常量、变量、属性、下标索引的定义类型是 private var privateInstance = SomePrivateClass()
Getter和Setter常量、变量、属性、下标索引的
下面的例子中定义了一个结构体名为 struct TrackedString {
private(set) var numberOfEdits = 0
var value: String = "" {
didSet {
numberOfEdits++
}
}
}
结构体 如果你实例化 var stringToEdit = TrackedString()
stringToEdit.value = "This string will be tracked."
stringToEdit.value += " This edit will increment numberOfEdits."
stringToEdit.value += " So will this one."
println("The number of edits is \(stringToEdit.numberOfEdits)")
// prints "The number of edits is 3"
虽然你可以在其他的源文件中实例化该结构体并且获取到 初始化我们可以给自定义的初始化方法指定访问级别,但是必须要低于或等于它所属类的访问级别。但如果该初始化方法是必须要使用的话,那它的访问级别就必须和所属类的访问级别相同。 如同函数或方法参数,初始化方法参数的访问级别也不能低于初始化方法的访问级别。 默认初始化方法Swift为结构体、类都提供了一个默认的无参初始化方法,用于给它们的所有属性提供赋值操作,但不会给出具体值。默认初始化方法可以参阅Default Initializers。默认初始化方法的访问级别与所属类型的访问级别相同。
结构体的默认成员初始化方法如果结构体中的任一存储属性的访问级别为 如果你想在其他模块中使用该结构体的默认成员初始化方法,那么你需要提供一个访问级别为 协议如果你想为一个协议明确的申明访问级别,那么有一点需要注意,就是你要确保该协议只在你申明的访问级别作用域中使用。 协议中的每一个必须要实现的函数都具有和该协议相同的访问级别。这样才能确保该协议的使用者可以实现它所提供的函数。
协议继承如果定义了一个新的协议,并且该协议继承了一个已知的协议,那么新协议拥有的访问级别最高也只和被继承协议的访问级别相同。比如说,你不能定义一个 协议一致性类可以采用比自身访问级别低的协议。比如说,你可以定义一个 采用了协议的类的访问级别遵循它本身和采用协议中最低的访问级别。也就是说如果一个类是 如果你采用了协议,那么实现了协议必须的方法后,该方法的访问级别遵循协议的访问级别。比如说,一个
扩展你可以在条件允许的情况下对类、结构体、枚举进行扩展。扩展成员应该具有和原始类成员一致的访问级别。比如你扩展了一个公共类型,那么你新加的成员应该具有和原始成员一样的默认的 或者,你可以明确申明扩展的访问级别(比如使用 协议的扩展如果一个扩展采用了某个协议,那么你就不能对该扩展使用访问级别修饰符来申明了。该扩展中实现协议的方法都会遵循该协议的访问级别。 泛型泛型类型或泛型函数的访问级别遵循泛型类型、函数本身、泛型类型参数三者中访问级别最低的级别。 类型别名任何被你定义的类型别名都会被视作为不同的类型,这些类型用于访问控制。一个类型别名的访问级别可以低于或等于这个类型的访问级别。比如说,一个
|
请发表评论