gpt4 book ai didi

结构上的 Swift 扩展使得私有(private)初始化保护变得不可能

转载 作者:搜寻专家 更新时间:2023-10-31 08:07:41 24 4
gpt4 key购买 nike

在 Swift 中,您可以通过将初始化器设为私有(private)来防止对象被直接初始化。您可能希望使用工厂模式来执行此操作。

但是如果你创建一个扩展,你可以提供一个不同的初始化器并且它可以编译。扩展名是否在同一个文件中并不重要。例如,如果您的工厂方法进行一些数据验证,这可能会产生严重的后果。

我是否遗漏了有关私有(private)初始化的信息?这似乎很糟糕。我可以阻止这种情况吗?

struct Foo {

let data: Int

// factory method
static func makeFoo(data: Int) -> Foo {
return Foo(data: data)
}

// private init with data validation
private init(data: Int) {
guard data < 100 else {
fatalError("Foo should only have values under 100")
}
self.data = data
}
}

extension Foo {
init(someData: Int) {
// This bypasses the data validation and puts Foo into an invalid state.
self.data = someData
}
}

最佳答案

根据上面 zneak 的评论,这将在 Swift 5 中被禁止。

关于结构上的 Swift 扩展使得私有(private)初始化保护变得不可能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47086598/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com