美文网首页
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