【发布时间】:2021-08-19 05:07:55
【问题描述】:
有时在 Swift 中,为委托给 JSONDecoder 或工厂方法的类编写初始化程序可能会很方便。例如,一个人可能想写
final class Test: Codable {
let foo: Int
init(foo: Int) {
self.foo = foo
}
func jsonData() throws -> Data {
try JSONEncoder().encode(self)
}
convenience init(fromJSON data: Data) throws {
self = try JSONDecoder().decode(Self.self, from: data)
}
}
let test = Test(foo: 42)
let data = try test.jsonData()
let decodedTest = try Test(fromJSON: data)
print(decodedTest.foo)
但这无法编译
Cannot assign to value: 'self' is immutable.
解决此问题的解决方案是什么?
【问题讨论】:
-
"静态函数
init". -
公平点。如果你想回答这个问题,我会投赞成票。不过,这种方法仍然存在问题。简单地说,你不能将它命名为
init,但更相关的是,你可能不喜欢工厂方法,或者出于协议一致性的原因,你可能需要它作为初始化器。 -
我不喜欢它,但我现在仍在使用它。用反引号包裹 init。
-
哦,哈哈,我很困惑为什么只有一部分呈现为代码。
标签: swift initializer