/* Access control 更新到Xcode6 Beta5
0.跟C++不同,swift的访问级别是针对文件,和模块的,
默认级别为模块内公开。如果仅仅是做单个App则,那么public的级别就用不到,
因为单个app没有外部模块的概念,若写Framework则需要考虑哪些部分需要设置为public
1.关于文件内访问级别
public 可以在模块内部和import了所在模块的外部模块访问
internal 可以用在模块内的任何文件访问,模块外文件不可访问
private 只能在本文件内使用
A module is a single unit of code distribution—a framework or application
that is built and shipped as a single entity and
that can be imported by another module with Swift’s import keyword.
Each build target (such as an app bundle or framework) in Xcode is
treated as a separate module in Swift
2.元组的访问级别是由其构成元素决定的,取所有成员的最低级别。
(public, internal) 最低级别为internal
3.函数默认为Internal,如果参数和返回值更低,则会报错。
func myFunc()->(InteralClass, privateclass)
返回值中最低为Private,所以该函数访问级别需要显示声明为private,否则编译报错。
4.不能为每个枚举内容指定级别,统一为枚举外部级别。raw value和Associated value
的类型需要高于等于整个枚举的访问级别。
5.嵌套类型
上一层为private的则下一层默认为private,其他都默认为internal的。
6.子类的级别永远低于父类的级别,子类可以override父类属性为更高级别的,但是不能向下override。
另外,由于swift的private定义为只允许本文件内访问
所以在统一文件中定义的子类可以访问父类的private属性。
7.可以为getter和setter设置不同的访问级别。
像OC一样,swift在背后会为每个stored property定义setter和getter函数
利用这个特点,可以为setter函数直接设置访问级别 private(set) internal (set)
private(set) var numberOfEdits = 0;定义一个只允许在本文件内修改的属性
8.访问级别上,构造函数同其他方法一样,默认为internal,因为默认构造函数为internal,所以
如果定义一个public的类的时候,需要用public显示的定义public的构造函数才可以。
✨✨一点例外:required 构造函数需要同类的访问级别相同。
9.所有的协议成员函数或属性都必须同协议本身级别相同。
协议同类一样,子类必须大于等于父类的访问级别。但是类在conform一个协议的时候可以遵循比自己访问级别低的。
比如 public class PublicClass : PrivateProtocol
*/
// 1.文件内访问级别控制
public class PublicClass {}
internal class InternalClass {} //默认级别,不需要显示声明
private class PrivateClass {}
public var publicVar = 0
internal let InternalConst = 0
private func privateFunc() {}
// 2.类型内访问级别控制
public class PubCls
{
public var pubProperty = 0;
var internalProperty = 0; //✨public的类默认成员为internal的。
private func privateMethod(){}
}
class DefaultInternal //类的定义默认为internal的。
{
//public var pubProperty = 0; Internal的类中不可以声明public的属性或者方法
var defaultInternalProperty = 0;
private func privateMethod(){}
}
private class PrvtClass
{
// internal var interClass = 0; Private的类不能有Internal和public的属性
var defaultPrivate = 0;
}
//类继承
/* 子类的级别永远低于父类的级别,子类可以override父类属性为更高级别的,但是不能向下override。
另外,由于swift的private定义为只允许本文件内访问
所以在统一文件中定义的子类可以访问父类的private属性
*/
class AccessTest
{
internal var internalVar = 10;
private var privateVar = 4;
private func testPrivateFunc()
{
println("private func in AccessTest");
}
func testInternalFunc()
{
println("internal func in AccessTest");
}
}
class AccessTestSub : AccessTest
{
override internal func testPrivateFunc()
{
println("override testPrivateFunc with internal");
super.testPrivateFunc() //因为定义在同一个文件中,所以可以访问父类的私有函数
}
//override private func testInternalFunc()
//{
//不能将父类中高级别的权限override为低级别的
//}
}
var a = AccessTestSub()
//和C++不同,类实例可以访问私有成员,子类和父类同文件时,甚至可以通过子类访问父类的私有成员。
println(a.privateVar)
class OtherfileSub : OtherfileClass
{
//可以继承其他文件中定义的public和internal的属性
}
var otherfilesub = OtherfileSub()
println(otherfilesub.tstInternal)
println(otherfilesub.tstDefaultInternal)
//OtherfileSub does not have a member named 'tstPrivate'
//println(otherfilesub.tstPrivate)
//setter getter
struct TrackedString {
private(set) var numberOfEdits = 0
var value: String = "" {
didSet {
numberOfEdits++
}
}
}