Swift 4 中 private 和 fileprivate 有什么区别

swift

1个回答

写回答

安妮妈咪

2025-08-19 12:35

+ 关注

Swift
Swift

Swift 4 中,私有访问控制是一种用于限制访问权限的机制。有两种不同的私有访问级别:privatefileprivate。尽管它们有相似之处,但它们在作用域和访问权限方面有一些关键区别。

首先,private访问级别用于限制实体(类、结构体、枚举或协议)的访问权限为仅在定义实体的源文件中可见。这意味着,如果在其他文件中尝试访问private实体,编译器将会报错。这种访问级别可以确保实体只能在其所属的源文件中被使用,并且对于其他模块是完全隐藏的。以下是一个示例代码:

Swift

fileprivate class Person {

private var name: String

init(name: String) {

self.name = name

}

func greet() {

print("Hello, my name is \(name).")

}

}

fileprivate let person = Person(name: "John")

person.greet()

在上面的例子中,Person类被声明为fileprivate,这意味着它只能在同一个源文件中访问。name属性被声明为private,这意味着它只能在Person类内部访问。greet()方法可以被其他实体调用,因为它的访问级别默认为internal,即在整个模块中可见。

区分privatefileprivate

尽管privatefileprivate的作用域都限制在定义实体的源文件中,但它们有一个主要区别:private限制的是封闭声明的作用域,而fileprivate限制的是整个源文件的作用域。这意味着,fileprivate实体可以在同一个源文件中的任何位置访问,而private实体只能在定义实体的封闭声明中访问。

下面是一个示例,演示了privatefileprivate之间的区别:

Swift

class Person {

private var name: String

init(name: String) {

self.name = name

}

fileprivate func greet() {

print("Hello, my name is \(name).")

}

}

extension Person {

func introduce() {

greet()

}

}

let person = Person(name: "John")

person.introduce()

在上面的例子中,greet()方法被声明为fileprivate,这意味着它可以在同一个源文件中的任何位置访问。introduce()方法是一个类扩展,它尝试调用greet()方法。由于greet()方法被声明为fileprivate,可以在扩展中访问它。

privatefileprivate都是 Swift 4 中的私有访问控制级别。它们的主要区别在于作用域范围:private限制在封闭声明中,而fileprivate限制在整个源文件中。通过使用适当的私有访问控制级别,可以确保代码的安全性和可维护性。

举报有用(4分享收藏

Copyright © 2025 IZhiDa.com All Rights Reserved.

知答 版权所有 粤ICP备2023042255号