美文网首页
Swift 中 Protect-Level 的用法

Swift 中 Protect-Level 的用法

作者: EngineerPan | 来源:发表于2021-01-02 20:10 被阅读0次

    Swift 中没有了.h、.m文件,以前OC中可以在interface、extension里面控制方法和属性的访问权限,那现在在 Swift 中是怎样处理这个问题的呢?
    Swift 中使用private、fileprivate、open、internal、public这几个关键字来控制类、方法和属性的访问权限。接下来我们来一起学习下这几个关键字的作用

    private

    People.swift

    /// People 类不能在其他类中使用,对外不可见
    private class People: NSObject {
        /// name、eat()只能在当前的类中使用;直接、间接子类中都不可用
        private var name: String = ""
        private func eat() {
            print("eat")
        }
        func run() {
        /// 在当前类中可以正常使用
         eat()
         print(name)
      }
    }
    

    Student.swift

    /// 继承 private 修饰的类时,子类只能使用 private 或者 fileprivate 修饰
    private class Student: People {
        /// 直接、间接子类中都不可用
        private var name: String = ""
        private func run() {
          /// 无法使用,无法创建 People 类的实例对象
          let peopleOne = People()
          /// 无法使用
          peopleOne.eat()
        }
    }
    

    fileprivate

    Dog.swift

    /// Dog 在同一个文件中可以访问
    fileprivate class Dog: NSObject {
        /// 在同一个文件中可以访问
        fileprivate var name: String = ""
        fileprivate func run() {
            print("run")
        }
    }
    
    /// 继承 fileprivate 修饰的类时,子类必须使用 private 或者 fileprivate 修饰
    fileprivate class Runner: Dog {
        func eat() {
            /// 同一个文件中可以使用
            let one = Dog()
            /// 可以使用
            one.run()
        }
    }
    

    Cat.swift

    class Cat: NSObject {
         func run() {
            /// 无法使用,Runner 类被 fileprivate 修饰,只能在同一个文件中使用
            let one = People()
        }
    }
    

    open

    open 外部可见,可以用于类和方法,不能用于常量属性,开放程度大于 public
    Car.swift

    /// Car 在任何文件中都可以访问
    open class Car: NSObject {
         open var nameStr = "nameStr"
         /// open 不能作用于 let 
         open let keyStr = "keyStr"
         open func run() {
        }
    }
    

    Pen.swift

    /// Pen 在任何文件中都可以访问
    open class Pen: NSObject {
         open func run() {
          /// 可以创建 Car.swift 中的 Car 类实例
          let two = Car()
          /// 可以调用Car.swift 中的 Car 类实例的实例方法
          two.run()
          print(two.nameStr)
        }
    }
    

    internal

    internal 外部可见,可以用于类、方法和属性

    public

    public 外部可见,可以用于类、方法和属性
    开放程度排序: open > public > internal >fileprivate > private

    相关文章

      网友评论

          本文标题:Swift 中 Protect-Level 的用法

          本文链接:https://www.haomeiwen.com/subject/bjyeoktx.html