访问控制(Access Control)

2019-07-26  本文已影响0人  曹来东

访问级别的使用准则

元祖类型

internal struct Dog {}
fileprivate class Person {}
//(Dog,Person)的访问级别为 fileprivate
fileprivate var data1: (Dog,Person)
private var data2:(Dog,Person)

泛型类型

internal class Car {}
fileprivate class Dog {}
//泛型Person<T1,T2>的访问级别为fileprivate
public class Person<T1,T2>{}

成员,嵌套类型


public class PublicClass {
    public var p1 = 0 //public
    var p2 = 0 //internal
    fileprivate func f1(){}//fileprivate
    private func f2(){}//private
}

class InternalClass {//internal
    var p = 0//internal
    fileprivate func f1(){}//fileprivate
    private func f2(){}//private

}
fileprivate class FilePrivateClass {
    func f1() { }//fileprivate
    private func f2(){}//private
}

private class PrivateClass{//private
    func f() {}//private
}

成员的重写

public class Person {
    private var age = 0
}
//age的访问权限 只能在Person中,子类Student不能重写age属性
public class Student : Person{
   override var age: Int {
    set {}
    get { return 10 }
    }
}

public class Person {
    private var age = 0
    public class Student : Person{
        override var age: Int {
            set {}
            get { return 10 }
        }
        
    }
}

以下代码是否编译通过

private class Person {}
fileprivate class Student : Person {}
private struct Dog {
    var age = 0
    func run() {  }
    
}
fileprivate struct Person {
    var dog = Dog()
    mutating func walk(){
        dog.run()
        dog.age = 1
    }
    
}

编译不通过

private struct Dog {
   private var age = 0
   private func run() {  }
    
}
fileprivate struct Person {
    var dog = Dog()
    mutating func walk(){
        //run() 和 age 权限为private
        //只能在定义他们的作用域使用
        dog.run()
        dog.age = 1
    }
}

getter setter

fileprivate(set) public var num = 0

class Person {//internal
    private(set) var age = 0 //age internal.set方法private
    fileprivate(set) public var weight: Int{
        set {}
        get { return 10 }
    }
    
    internal(set) public subscript(index: Int) -> Int {
        set {}
        get { return index}
    }
}

初始化器

枚举类型的case

协议

public protocol Runnable {
    func run()
}
//要添加public,默认是internal
public class Person : Runnable{
     func run() {
        
    }
}

扩展

public class Person {
    private func run0() {}
    private func eat0() {
        run0()
    }
}

extension Person {
    private func run1(){}
    private func eat1(){
        run0()
        eat2()
    }
}

extension Person {
    private func eat2() {
        run1()
        eat0()
    }
}

将方法赋值给var/let

struct Person {
    var age : Int
    func run(_ v: Int) {
        print("func run", age ,v)
    }
    static func run(_ v: Int){
        print("static func run",v)
    }
}
let fn1 = Person.run
fn1(10)//static func run 10

let fn2: (Int) -> () = Person.run
fn2(20)//static func run 20

let fn3: (Person) -> ((Int) -> ()) = Person.run
fn3(Person(age: 18))(30)//func run 30

上一篇 下一篇

猜你喜欢

热点阅读