swift---24.访问控制

2017-03-15  本文已影响20人  阿丶伦

代码中可以设置访问级别的特性(属性、基本类型、函数等)

框架或应用程序会作为一个独立的模块来构建和发布.不同模块,需要使用import导入.例子:通过"Xcode"创建的APP工程

模块内的代码文件.例子:工程内的某一个".swift"文件,同一个模块内,源文件之间可以互相调用,不需要导入

元组的访问级别由存入值中,访问级别最低的实体决定
- ###函数:
函数的访问级别,由它的参数或者返回类型来决定,且不会隐式转换,可以看到,我们定义了两个类,一个方法,方法返回值是一个元组,上面我们提到元组的访问级别由最低的实体决定,所以放回参数的访问级别为private,这时候如果我们不对方法限制,方法的默认级别为internal,则会引起报错
internal class SomeInternalClass {} private class SomePrivateClass {} //报错 //func someFunction() -> (SomeInternalClass, SomePrivateClass) { // return (SomeInternalClass(),SomePrivateClass()) //} private func anotherFunction() -> (SomeInternalClass, SomePrivateClass) { return (SomeInternalClass(),SomePrivateClass()) }
- ###枚举:
枚举的每个事件的访问级别,与枚举的访问级别相同,枚举的原始值类型的访问级别不能低于枚举的访问级别
public typealias A = Int public enum AnEnum:A { case A = 0 case B case C } //报错,因为枚举时public类型,而类型private private typealias B = Int //public enum AotherEnum:B { // case A = 0 // case B // case C //}
- ###嵌套类型:
嵌套类型中,如果外部是public类型,嵌套的类型为internal,其他的访问级别,与外部访问级别一致
- ###子类:
子类的访问级别不能高于父类,但子类能通过重写父类的方法与属性来改变访问级别
internal class ClassA { private var num:Int { return 1 } } //报错,子类访问级别不能高于父类 //public class ClassB:ClassA { // //} class ClassB:ClassA { override internal var num :Int{ return 3 } }
- ###常量,变量,属性,下标:
变量常量的访问级别不能高于实例对应类型的访问级别,属性,下标的访问级别也不可高于所在的类,
private class ClassA { //报警告 public var name = "" //报警告 public subscript(index:String) -> String { return "a" } } //报错,变量常量的访问级别不能高于实例对应类型的访问级别 //public var classA = ClassA()

- ###getter,setter:

我们可以通过调低属性的setter访问级别,使属性在外部变为只读属性.我们也可以同时设置属性的setter,getter的访问属性
struct TrackedString { internal private(set) var numberOfEdits = 0 var value: String = "" { didSet { numberOfEdits += 1 } } }
- ###构造器:
必要构造器的访问级别必须与它所在类型的访问级别相同,自定义构造器访问级别可以低于所在类
class ClassA { // //报错,必要构造器的访问级别过低 // private required init (name:String) { // // } private init (name:String) { } }
- ###类型别名:
低访问级别的类型不能转换为高访问级别的类型,高访问级别的类型可以随意转换成比其低级别的类型
private class ClassA { } public class ClassB { } //报错,低访问级别的类型不能转换为高访问级别的类型 //public typealias SomeClass = ClassA public typealias AnotherClass = ClassB

上一篇 下一篇

猜你喜欢

热点阅读