使 @MainActor class 或 actor 符合 Codable
Conforming @MainActor class, or actor, to Codable
如何将 Codable 一致性添加到需要与 MainActor 隔离的 class?
例如,下面的代码给出了编译器错误:
@MainActor final class MyClass: Codable {
var value: Int
enum CodingKeys: String, CodingKey {
case value
}
init(from decoder: Decoder) throws { // <-- Compiler error: Initializer 'init(from:)' isolated to global actor 'MainActor' can not satisfy corresponding requirement from protocol 'Decodable'
let data = try decoder.container(keyedBy: CodingKeys.self)
self.value = try data.decode(Int.self, forKey: .value)
}
func encode(to encoder: Encoder) throws { // <-- Compiler error: Instance method 'encode(to:)' isolated to global actor 'MainActor' can not satisfy corresponding requirement from protocol 'Encodable'
var container = encoder.container(keyedBy: CodingKeys.self)
try container.encode(value, forKey: .value)
}
}
我现在肯定在努力了解演员和@MainActor!
您提供的 class 没有任何内容 需要 与主要演员隔离,所以不要隔离 class 作为一个整体。如果还有其他您没有向我们展示的成员确实需要与主要演员隔离,请隔离他们。
示例:
final class MyClass: Codable {
private var value: Int
@MainActor init(value: Int) {
self.value = value
}
@MainActor func setMyValue(to newValue:Int) {
self.value = newValue
}
@MainActor func getMyValue() -> Int {
self.value
}
enum CodingKeys: String, CodingKey {
case value
}
init(from decoder: Decoder) throws {
let data = try decoder.container(keyedBy: CodingKeys.self)
self.value = try data.decode(Int.self, forKey: .value)
}
func encode(to encoder: Encoder) throws { // <-- Compiler error: Instance method 'encode(to:)' isolated to global actor 'MainActor' can not satisfy corresponding requirement from protocol 'Encodable'
var container = encoder.container(keyedBy: CodingKeys.self)
try container.encode(value, forKey: .value)
}
}
如何将 Codable 一致性添加到需要与 MainActor 隔离的 class?
例如,下面的代码给出了编译器错误:
@MainActor final class MyClass: Codable {
var value: Int
enum CodingKeys: String, CodingKey {
case value
}
init(from decoder: Decoder) throws { // <-- Compiler error: Initializer 'init(from:)' isolated to global actor 'MainActor' can not satisfy corresponding requirement from protocol 'Decodable'
let data = try decoder.container(keyedBy: CodingKeys.self)
self.value = try data.decode(Int.self, forKey: .value)
}
func encode(to encoder: Encoder) throws { // <-- Compiler error: Instance method 'encode(to:)' isolated to global actor 'MainActor' can not satisfy corresponding requirement from protocol 'Encodable'
var container = encoder.container(keyedBy: CodingKeys.self)
try container.encode(value, forKey: .value)
}
}
我现在肯定在努力了解演员和@MainActor!
您提供的 class 没有任何内容 需要 与主要演员隔离,所以不要隔离 class 作为一个整体。如果还有其他您没有向我们展示的成员确实需要与主要演员隔离,请隔离他们。
示例:
final class MyClass: Codable {
private var value: Int
@MainActor init(value: Int) {
self.value = value
}
@MainActor func setMyValue(to newValue:Int) {
self.value = newValue
}
@MainActor func getMyValue() -> Int {
self.value
}
enum CodingKeys: String, CodingKey {
case value
}
init(from decoder: Decoder) throws {
let data = try decoder.container(keyedBy: CodingKeys.self)
self.value = try data.decode(Int.self, forKey: .value)
}
func encode(to encoder: Encoder) throws { // <-- Compiler error: Instance method 'encode(to:)' isolated to global actor 'MainActor' can not satisfy corresponding requirement from protocol 'Encodable'
var container = encoder.container(keyedBy: CodingKeys.self)
try container.encode(value, forKey: .value)
}
}