Swift访问控制级别
Swift访问控制级别

Swift访问控制级别

Swift 的访问控制机制允许开发者控制类、结构体、枚举、协议、属性、方法等的可访问性。通过合理设置访问控制级别,可以保护代码内部的实现,同时为外部代码提供必要的接口。Swift 主要有以下几种访问控制级别:

访问控制级别

1、open

最低访问控制级别,表示最开放的权限。

用于类、类的成员(如方法、属性),以及构造器。

open 可以在当前模块内外访问,并且允许被子类化和重写。

使用场景:当希望其他模块能够继承或重写类和方法时使用。

open class MyClass {
    open func myMethod() {
        print("Open method")
    }
}

2、public

表示对外部可见,但不能被继承和重写。

可以在当前模块内和外部模块访问。

使用场景:当希望外部模块能够访问类或方法,但不希望它们被继承或重写时使用。

public class MyClass {
    public func myMethod() {
        print("Public method")
    }
}

3、internal

默认访问控制级别,表示在当前模块内可以访问。

仅允许当前模块内的代码访问,模块外部的代码无法访问。

使用场景:这是大多数情况下的默认选择,通常用于不需要对外暴露的功能。

class MyClass {
    func myMethod() {
        print("Internal method")
    }
}

internal 是默认访问级别,因此如果没有显式地设置访问控制级别,Swift 会自动将其设为 internal。

4、fileprivate

表示仅限于当前文件中的代码访问。

使用场景:当希望限制访问范围至当前源文件内时使用。

注意:fileprivate 的访问控制比 internal 更严格,因为它只允许在同一文件内访问。

fileprivate class MyClass {
    fileprivate func myMethod() {
        print("Fileprivate method")
    }
}

5、private

最严格的访问控制,只能在当前作用域内访问。

限制访问至定义该类、方法、属性的代码块内(例如,类或方法内部)。

使用场景:当只希望在类内部或方法内部使用某个功能时使用。

class MyClass {
    private func myMethod() {
        print("Private method")
    }
}

访问控制级别

使用场景

1、open 和 public

用于库和框架,特别是如果希望其他开发者继承或重写某些类或方法时,应该使用 open。

public 用于公开方法和类,但不允许继承或重写。

2、internal

用于不需要对外公开的类、方法或属性,通常用于项目的内部实现。

3、fileprivate

当需要限制某个方法或属性只在当前文件中使用时。

4、private

用于将方法或属性限制为仅在类的实现中可用,通常用于隐藏类内部细节,保证封装性。

示例代码

class Vehicle {
    public var brand: String
    private var speed: Int
    
    init(brand: String, speed: Int) {
        self.brand = brand
        self.speed = speed
    }
    
    public func drive() {
        print("\(brand) is driving at \(speed) mph.")
    }
    
    private func accelerate() {
        speed += 10
        print("\(brand) accelerated. Current speed: \(speed) mph.")
    }
    
    fileprivate func stop() {
        speed = 0
        print("\(brand) stopped.")
    }
}

let myCar = Vehicle(brand: "Toyota", speed: 60)
myCar.drive() // Works fine because `drive` is public
// myCar.accelerate() // Error: 'accelerate' is private
// myCar.stop() // Error: 'stop' is fileprivate and can't be accessed outside the file

总结

open:最开放的级别,适用于希望其他模块继承和重写的类、方法和属性。

public:公开的,但不允许继承和重写。

internal:默认级别,仅在当前模块内可访问。

fileprivate:仅在当前文件内可访问。

private:限制访问到当前作用域,最严格的级别。

如果您认为这篇文章给您带来了帮助,您可以在此通过支付宝或者微信打赏网站开放者。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注