《swift2.0 官方教程中文版》 第2章-24访问控制

来源:互联网 发布:ff14 数据库 编辑:程序博客网 时间:2024/06/08 02:08


import Foundation


/*模块和源文件**************************************************************/

//模块指的是以独立单元构建和发布的 Framework Application 。在Swift中的一个模块可以使用 import 关键字引入另外一个模块。




/*访问级别**************************************************************/

//public:可以访问自己模块中源文件里的任何实体,别人也可以通过引入该模块来访问源文件里的所有实体。通常情况下, Framework 中的某个接口是可以被任何人使用时,你可以将其设置为  级别。

//internal:可以访问自己模块中源文件里的任何实体,但是别人不能访问该模块中源文件里的实体。通常情况下,某个接口或 Framework作为内部结构使用时,你可以将其设置为 internal级别。

//private:只能在当前源文件中使用的实体,称为私有实体。使用private级别,可以用作隐藏某些功能的实现细节。

//public为最高级访问级别, private为最低级访问级别。


//Swift中的private访问和其他语言中的 private访问不太一样,它的范围限于整个源文件,而不是声明。这就意味着,一个 可以访问定义该的源文件中定义的所有 private 实体,但是如果一个 的扩展是定义在独立的源文件中,那么就不能访问这个类 private 成员。

//一个public访问级别的变量,不能将它的类型定义为internalprivate。因为变量可以被任何人访问,是定义它的类型不可以,所以这样就会出现错误

//函数的访问级别不能高于它的参数、返回类型的访问级别。因为如果函数定义为 public而参数或者返回类型 定义为 internal private ,就会出现函数可以被任何人访问,但是它的参数和返回类型确不可以,同样会出现错误。

//如果你不为代码中的所有实体定义显式访问级别,那么它们默认为 internal级别。在大多数情况下,我们不需要设置实体的显式访问级别。因为我们一般都是在开发一个 app bundle

//当你开发 Framework,就需要把一些对外的接口定义为 public级别,以便其他人导入该 Framework后可以正常使用其功能。这些被你定义为 public 的接口,就是这个 FrameworkAPI




/*访问控制语法**************************************************************/

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类的所有成员的访问级别默认为 internal 级别,而不是 public级别。如果你想 将某个成员申明为 public级别,那么你必须使用修饰符明确的声明该成员。这样做的好处是,在你定义公共接API的时候,可以明确的选择哪些属性或方法是需要公开的,哪些是内部使用的,可以避免将内部使用的属性方法公开成公共API的错误。

public class SomePublicClass2 { //  显示的public

    publicvar somePublicProperty = 0  // 显示的public类成员

    var someInternalProperty =0    // 隐式的internal类成员

    privatefunc somePrivateMethod(){} // 显示的private类成员

}


class SomeInternalClass2 {// 隐式的 internal

    var someInternalProperty =0 // 隐式的 internal 类成员

    privatefunc somePrivateMethod() {} // 显式的 private 类成员

}

private class SomePrivateClass2 {   // 显式的 private

        var somePrivateProperty =0 // 隐式的 private 类成员

        func somePrivateMethod() {}// 隐式的 private类成员

}


//元组的访问级别使用是所有类型的访问级别使用中最为严谨的。比如说,如果你构建一个包含两种不同类型元素的元组,其中一个元素类型的访问级别为 internal ,另一个为 private级别,那么这个元组的访问级别为 private。也就是说元组的访问级别与元组中访问级别最低的类型一致。

//事实上,如果按下面这种写法,代码是无法编译通过的:

//func someFunction() -> (SomeInternalClass2, SomePrivateClass2) {

//        // function implementation goes here

//}

//因为该函数返回类型的访问级别是 private  ,所以你必须使用  private修饰符,明确的声明该函数:

//private func someFunction() -> (SomeInternalClass2, SomePrivateClass2) {

//    // function implementation goes here

//}


//枚举中成员的访问级别继承自该枚举,你不能为枚举中的成员单独申明不同的访问级别。

// 比如下面的例子,枚举CompassPoint被明确的申明为public级别,那么它的成员North,South,East,West的访问级别同样也是public

public enum CompassPoint {

    case North

    case South

    case East

    case West

}




/*子类**************************************************************/

//子类的访问级别不得高于父类的访问级别。比如说,父类的访问级别是 internal ,子类的访问级别就不能申明为 public

// 可以这样写以便访问私有方法,私有变量

public class A {

    privatefunc someMethod() {}

}

internal class B :A{

    overrideinternal func someMethod() {

        super.someMethod()

    }

}




/*常量、变量、属性、下标**************************************************************/

//如果常量、变量、属性、下标索引的定义类型是 private级别的,那么它们必须要明确的申明访问级别为 private:

private var privateInstance =SomePrivateClass()

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."

print("The number of edits is\(stringToEdit.numberOfEdits)")

// prints "The number of edits is 3"


public struct TrackedString2 {

    publicprivate(set) var numberOfEdits =0

    publicvar value: String ="" {

        didSet {

        numberOfEdits++

        }

    }

    publicinit() {}

}




/*初始化**************************************************************/

//我们可以给自定义的初始化方法申明访问级别,但是要不高于它所属类的访问级别。




/*协议**************************************************************/

//如果你定义了一个 public访问级别的协议,那么实现该协议提供的必要函数也会是 public的访问级 别。这一点不同于其他类型,比如, public访问级别的其他类型,他们成员的访问级别为 internal

//如果定义了一个新的协议,并且该协议继承了一个已知的协议,那么新协议拥有的访问级别最高也只和被继承协议的访问级别相同。比如说,你不能定义一个 public的协议而去继承一个 internal 的协议。

//类可以采用比自身访问级别低的协议。比如说,你可以定义一个 public级别的类,可以让它在其他模块中使,同时它也可以采用一个 internal级别的协议,并且只能在定义了该协议的模块中使用。

//SwiftObjective-C一样,协议的一致性保证了一个类不可能在同一个程序中用不同的方法采用同一个协议。




/*扩展**************************************************************/

/*泛型**************************************************************/

/*类型别名**************************************************************/

0 0