您的位置:首页 > 移动开发 > Swift

swift2.0 学习笔记Twenty-one

2016-06-28 10:49 260 查看
import UIKit

class ViewController: UIViewController {

    

    override
func viewDidLoad() {

        super.viewDidLoad()

       //访问控制

      
//访问控制可以限定其他源文件或模块中代码对你代码的访问级别。可以明确的声明我们提供给他人的接口中哪些部分是他们可以访问和使用的。

      
//可以明确的给单个类型(类,结构体,枚举)设置访问级别,也可以给这些类型的属性、函数、初始化方法、基本类型、下标索引等设置访问级别。协议也可以被限定在一定的范围内使用,包括协议里的全局常量、变量和函数

        

      //模块和源文件

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

       
//在swift中,xcode的每个构建目标(比如Framework或app
bundle)都被当作模块处理。如果为了实现某个通用功能,或者是为了封装一些常用方法而将代码打包成独立的Framework,这个Framework在Swift中就被称为模块,里边的一切都属于这个独立的模块

       
//源文件指的是Swift中的Swift File,就是编写Swift源代码的文件,它通常属于一个模块。尽管一般我们将不同的类分别定义在不同的源文件中,但是同一个源文件可以包含多个类和函数的定义。

        

        //访问级别

       
//Swift为代码中的实体提供了三种不同的访问级别。这些访问级别不仅与源文件中定义的实体相关,同时也与源文件所属的模块相关

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

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

       
//private:只能在当前源文件中使用的实体,称为私有实体。使用private级别,可以用作隐藏某些功能的实现细节。他的范围仅限于源文件,一个类可以访问定义该类的源文件中定义的所有private实体,但是如果一个类的扩展是定义在独立的源文件中,那么就不能访问这个类的private成员

        

        //默认访问级别

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

        //Framework的访问级别

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

    

       
//元组不同于类、结构体、枚举、函数那样有单独的定义。元组的访问级别是它被使用时自动推导出的,而不是明确的声明

       
//函数的访问级别需要根据该函数的参数类型和返回类型的访问级别得出。如果根据参数类型和返回类型得出的函数访问级别不符合默认上下文,那么就需要明确地声明该函数的访问级别。

        

        //枚举类型

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

        

        //嵌套类型

       
//如果在private级别的类型中定义嵌套类型,那么该嵌套类型就自动拥有private访问级别。如果在public或者internal级别的类型中定义嵌套类型,那么该嵌套类型自动拥有internal访问级别。如果想让嵌套类型拥有public访问级别,那么需要明确地声明该嵌套类型的访问级别。

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

       
//只要满足子类不高于父类访问级别以及遵循各访问级别作用域的前提下(即private的作用域在同一个源文件中,internal的作用域在同一个模块下),我们可以在子类中,用子类成员访问父类成员,哪怕父类成员的访问级别比子类成员要低。

        

     
//常量、变量、属性不能拥有比它们的类型更高的访问级别。比如说,定义了一个public级别的属性,但是他的类型是private级别的。这是编译器不允许的。

     

        var stringToEdit =
TrackedString()

        stringToEdit.value =
"This string will be tracked"

        stringToEdit.value +=
"This edit will increment numberOfEdits."

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

        //The number of edits is 2

        

        //初始化

       
//我们可以给自定义的初始化方法声明访问级别,但是要不高于它所属类的访问级别。但必要构造器例外,它的访问级别必须和所属类的访问级别相同。

        

        

        

    }

  

    

}

public struct TrackedString2{

    public
private(set)
var numberOfEdits = 0//numberOfEdits属性Getter方法的访问级别设置为public,而Setter方法的访问级别设置为private

    public
var value:String =
""{

        didSet{

            numberOfEdits++

        }

    }

    public
init() {}

}

struct TrackedString {

    private(set)
var numberOfEdits = 0//结构体的numberOfEdits属性使用private(set)
修饰符进行声明,这意味着numberOfEdits属性只能在定义该结构体的源文件中赋值。numberOfEdits属性的Getter依然是默认的访问级别internal。该属性只有在当前的源文件中是可读写的,在当前源文件所属的模块中它只是一个可读的属性。

    var value:String =
"" {

        didSet{

            numberOfEdits++

        }

    }

}

public class A{

    private
func someMethod(){}

}

internal class B:A{

    override
internal func someMethod() {

        super.someMethod()

    }

}

public enum CompassPoint{

    case North

    case South

    case East

    case West

}

//这个函数返回类型是一个元组,该元组中包含两个自定义的类。其中一个类的访问级别是internal,另一个类的访问级别是private,所以根据元组访问级别的原则,该元组访问的级别是private(元组的访问级别与元祖中访问级别最低的类型一致)

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

private func someFunction() -> (SomeInternalClass,SomePrivateClass){

    

    return(SomeInternalClass(),SomePrivateClass())

}

//类的访问级别也可以影响到类成员的默认访问级别。如果将类声明为private类,那么该类的所有成员的默认访问级别也会成为private。如果你将类声明为public或者internal类那么该类的所有成员的访问级别是internal

public class SomePublicClass{//显示的public类

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

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

    private
func somePricateMethod(){}//显示的private类成员

}

class SomeInternalClass {//隐士的internal类

    var someInternalProperty = 0//隐士的internal类

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

}

private class SomePrivateClass{
//显示的private类

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

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

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: