最近正在参与的Swift2.0翻译工作(Access Control章节)
访问控制本页内容包括:
访问控制可以限定其他源文件或模块中代码对你代码的访问级别。这个特性可以让我们隐藏功能实现的一些细节,并且可以明确的申明我们提供给其他人的接口中哪些部分是他们可以访问和使用的。 你可以明确地给单个类型(类、结构体、枚举)设置访问级别,也可以给这些类型的属性、函数、初始化方法、基本类型、下标索引等设置访问级别。协议也可以被限定在一定的范围内使用,包括协议里的全局常量、变量和函数。 在提供了不同访问级别的同时,Swift还为某些典型场景提供了默认的访问级别,这样就不需要我们在每段代码中都申明显式访问级别。其实,如果只是开发一个单目标应用程序,我们完全可以不用申明代码的显式访问级别。
模块和源文件Swift 中的访问控制模型基于模块和源文件这两个概念。 模块指的是以独立单元构建和发布的 在 Swift 中,Xcode的每个构建目标(比如 源文件指的是 Swift 中的 访问级别Swift 为代码中的实体提供了三种不同的访问级别。这些访问级别不仅与源文件中定义的实体相关,同时也与源文件所属的模块相关。
访问级别的使用原则Swift 中的访问级别遵循一个使用原则:访问级别统一性。
默认访问级别如果你不为代码中的所有实体定义显式访问级别,那么它们默认为 单目标应用程序的访问级别当你编写一个单目标应用程序时,该应用的所有功能都是为该应用服务,不需要提供给其他应用或者模块使用,所以我们不需要明确设置访问级别,使用默认的访问级别 Framework的访问级别当你开发
单元测试目标的访问级别当你的app有单元测试目标时,为了方便测试,测试模块需要能访问到你app中的代码。默认情况下只有 访问控制语法通过修饰符 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"
虽然你可以在其他的源文件中实例化该结构体并且获取到 如果有必要你可以为 public struct TrackedString {
public private(set) var numberOfEdits = 0
public var value: String = "" {
didSet {
numberOfEdits++
}
}
public init() {}
}
初始化我们可以给自定义的初始化方法申明访问级别,但是要不高于它所属类的访问级别。但必要构造器例外,它的访问级别必须和所属类的访问级别相同。 如同函数或方法参数,初始化方法参数的访问级别也不能低于初始化方法的访问级别。 默认初始化方法Swift为结构体、类都提供了一个默认的无参初始化方法,用于给它们的所有属性提供赋值操作,但不会给出具体值。默认初始化方法可以参阅Default Initializers。默认初始化方法的访问级别与所属类型的访问级别相同。
结构体的默认成员初始化方法如果结构体中的任一存储属性的访问级别为 如果你想在其他模块中使用该结构体的默认成员初始化方法,那么你需要提供一个访问级别为 协议如果想为一个协议明确的申明访问级别,那么需要注意一点,就是你要确保该协议只在你申明的访问级别作用域中使用。 协议中的每一个必须要实现的函数都具有和该协议相同的访问级别。这样才能确保该协议的使用者可以实现它所提供的函数。
协议继承如果定义了一个新的协议,并且该协议继承了一个已知的协议,那么新协议拥有的访问级别最高也只和被继承协议的访问级别相同。比如说,你不能定义一个 协议一致性类可以采用比自身访问级别低的协议。比如说,你可以定义一个 采用了协议的类的访问级别取它本身和所采用协议中最低的访问级别。也就是说如果一个类是 如果你采用了协议,那么实现了协议所必须的方法后,该方法的访问级别遵循协议的访问级别。比如说,一个
扩展你可以在条件允许的情况下对类、结构体、枚举进行扩展。扩展成员应该具有和原始类成员一致的访问级别。比如你扩展了一个公共类型,那么你新加的成员应该具有和原始成员一样的默认的 或者,你可以明确申明扩展的访问级别(比如使用 协议的扩展如果一个扩展采用了某个协议,那么你就不能对该扩展使用访问级别修饰符来申明了。该扩展中实现协议的方法都会遵循该协议的访问级别。 泛型泛型类型或泛型函数的访问级别取泛型类型、函数本身、泛型类型参数三者中的最低访问级别。 类型别名任何你定义的类型别名都会被当作不同的类型,以便于进行访问控制。一个类型别名的访问级别不可高于原类型的访问级别。比如说,一个
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- Swift主题卫衣来了!16 款程序员专属极客卫衣任你选
- PostgreSQL服务过程中的那些事二:Pg服务进程处理简单查询一
- AJAX原始对象的使用(XMLHttpRequest+javascript+asp.net)
- 渐渐远去的Hybrid技术
- react-native – React Navigation Reset可以添加参数吗?
- 为EXt JsonStore设置设置timeOut
- postgresql – 如何使用pgAdmin在Ubuntu上连接Postgres到本
- swift – 在MacOS上将Vapor编译为独立应用程序
- 如何在Flex Canvas触发子元素上停止Mouse Out事件
- c – 对’get_driver_instance’的未定义引用