我在Swift中有一个特定的类,希望限制创建扩展。我尝试添加final
关键字,但它并不能限制创建扩展:
final class MyTest {
func testFunc() {}
}
extension MyTest {
func testFunc2() {}
}
let test = MyTest()
test.testFunc2()
这是可能的吗?
我在Swift中有一个特定的类,希望限制创建扩展。我尝试添加final
关键字,但它并不能限制创建扩展:
final class MyTest {
func testFunc() {}
}
extension MyTest {
func testFunc2() {}
}
let test = MyTest()
test.testFunc2()
您无法防止其他人向您的类添加扩展,就像您无法阻止另一个开发人员编写使用您的类的函数一样。
final
修饰符仅可防止子类化。其他开发人员始终可以添加扩展。
在我看来不是。
让我们来看看这个类:
final class Person {
private let name: String
func tellName() -> String { return "I am \(name)" }
init(name: String) {
self.name = name
}
}
func presentAndTellName(person: Person) {
print("Hello everybody! \(person.tellName())")
}
func presentAndTellName(person: Person) {
print("Hello everybody! \(person.tellName())")
}
变成这样
extension Person {
func presentAndTellName() {
print("Hello everybody! \(self.tellName())")
}
}
这只是一种编写相同逻辑并以OOP语法糖形式提供的方法。
现在,我们可以用以下方式来代替上述代码:
presentAndTellName(person)
我们可以写成这样
。person.presentAndTellName()
那么,如何保护你的类(/结构体)逻辑和数据不受扩展的影响?使用与保护源文件外部函数相同的机制,只需将它们标记为private
。这样其他开发人员就无法在他们的扩展中使用它们。
让我们再次看一下我们的Person类。
class Person {
private let name: String
func tellName() -> String { return "I am \(name)" }
init(name: String) {
self.name = name
}
}
name
属性被标记为私有,因此没有办法让外部函数或扩展直接访问它。
好的,也许这是扩展提供的唯一可以比更好的语法更多的东西。
实际上,考虑到这个协议:
protocol Runner {
func run()
}
extension Person: Runner {
func run() { print("") }
}
myFunc(object)
而不是object.myFunc
并不能进一步实现封装目标。 - Rob Napier