Access Control

/* 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 valueAssociated value

的类型需要高于等于整个枚举的访问级别。


5.嵌套类型

上一层为private的则下一层默认为private,其他都默认为internal的。


6.子类的级别永远低于父类的级别,子类可以override父类属性为更高级别的,但是不能向下override

另外,由于swiftprivate定义为只允许本文件内访问

所以在统一文件中定义的子类可以访问父类的private属性。


7.可以为gettersetter设置不同的访问级别。

OC一样,swift在背后会为每个stored property定义settergetter函数

利用这个特点,可以为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的类不能有Internalpublic的属性

    var defaultPrivate = 0;

}


//类继承

/* 子类的级别永远低于父类的级别,子类可以override父类属性为更高级别的,但是不能向下override


另外,由于swiftprivate定义为只允许本文件内访问

所以在统一文件中定义的子类可以访问父类的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

{

    //可以继承其他文件中定义的publicinternal的属性

}

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++

        }

    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值