private、fileprivate、public、open

1、private 修饰符

private只允许在当前类所在源文件中调用, 修饰的方法不可以被代码域之外的地方访问 ,本类源码文件的extension除外。

Person.swift


import Foundation

import UIKit

class Person: NSObject {

    

    private let name = "niu"

    override init() {

        super.init();

    }

}

extension Person

{

    func LocalPersonExtension()-> Void {

         print(name); //正确

    }

}

class Women: Person {

    func LocalPersonWomen()-> Void {

        print(name); //报错

    }

}

class Dog: NSObject {

    func LocalPersonDog()-> Void {

        print( Person().name); // 报错

    }

}


编译后



OtherClass.swift


import Foundation

class Man: Person {

    func RemotePersonMan() -> Void {

         print(name);

    }

}

extension Person{

    func RemotePersonExtension() -> Void {

        print(name);

    }

}

class Cat: NSObject {

    func RemotePersonCat()-> Void {

        print( Person().name);

    }

}



编译报错



2、fileprivate 修饰符

fileprivate   其修饰的属性或者方法只能在当前的 Swift 源文件里可以访问,即在同一个文件中,所有的 fileprivate 方法属性都是可以访问到的。

Person.swift


import Foundation

import UIKit

class Person: NSObject {

    

    fileprivate let name = "niu"

    override init() {

        super.init();

    }

}

extension Person

{

    func LocalPersonExtension()-> Void {

         print(name);//正确

    }

}

class Women: Person {

    func LocalPersonWomen()-> Void {

        print(name); //正确

    }

}

class Dog: NSObject {

    func LocalPersonDog()-> Void {

        print( Person().name); //正确

    }

}


OtherClass.swift


编译后报错


3、public 修饰符

修饰的属性或者方法可以在其他作用域被访问  
但不能在重载 override 中被访问  
也不能在继承方法中的 Extension 中被访问

4、open 修饰符

open则是弥补public语义上的不足。
现在的pubic有两层含义:

  • 这个元素可以在其他作用域被访问
  • 这个元素可以在其他作用域被继承或者override

继承是一件危险的事情。尤其对于一个framework或者module的设计者而言。在自身的module内,类或者属性对于作者而言是清晰的,能否被继承或者override都是可控的。但是对于使用它的人,作者有时会希望传达出这个类或者属性不应该被继承或者修改。这个对应的就是<code> final </code>。

<code> final </code>的问题在于在标记之后,在任何地方都不能override。而对于lib的设计者而言,希望得到的是在module内可以被override,在被import到其他地方后其他用户使用的时候不能被override。

这就是<code> open </code>产生的初衷。通过open和public标记区别一个元素在其他module中是只能被访问还是可以被override。

Person.swift



import Foundation

//在module范围外不能被继承,只能被访问

public class PersonPublic {

    

    public func PersonPublicFun() {}

    

    //类已经定义成不能被继 承的,而这个方法不能设置成既可以继承又可以重载的

    //下层的权限不能大于上层的权限大小,此种写法是错误的

    open func PersonOpenFun() {}

    

    //final 保持不变

    public final func PersonPublicFinalFun() {}

    

}


//在module 范围外可以被继承

open class PersonOpen {

    //属性在module范围外不能被重载

    public var height : Int = 0


    //此方法不能在module范围外可以被重载

    public func PersonPublicFun() {}


    // 此方法在任何module都可以被重载

    open func PersonOpenFun() {}


    //final 保持不变

    public final func PersonPublicFinalFun() {}


}

//final 保持不变

public final class PersonFinal { }



Man.swift

import Foundation

//编译失败,因为dogPublic 的权限是public,在module外只能被访问,不能被继承

class PersonA : PersonPublic { }


////OK ,编译成功

class PersonB : PersonOpen {

    //编译失败, 因为dogPublic 是public的,在module范围之外只能被访问,不能被重载

    override func PersonPublicFun() {}

    //OK, 编译成功,open定义的方法在open定义的类中可以被重载

    override func PersonOpenFun() {}

}


open class PersonC : PersonOpen{

    //    编译失败,失败的原因是这个catC的类被定义成open类型

    //    在重载open方法的时候,需要声明权限

   // override func PersonOpenFun() { }

    //    编译成功,真对上面的修改,指出访问权限

    open override func PersonOpenFun() { }

}


open class PersonD : PersonOpen{

    //显示的指出方法不能被重载

    public final override func PersonOpenFun() { }

}

5、internal修饰符

顾名思义,internal是内部的意思,即有着internal访问权限的属性和方法说明在模块内部可以访问,超出模块内部就不可被访问了。在Swift中默认就是internal的访问权限。

从高到低排序如下:

open > public > interal > fileprivate > private

猜你喜欢

转载自blog.csdn.net/shubinniu/article/details/79239155