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
网友评论