【发布时间】:2020-04-18 19:06:33
【问题描述】:
我正在尝试创建一个 Actor 类以及一个可以从 JSON 文件解码的 Movie 类。还有一个字典,allActors,包含每个Actor 实例,因此每部解码的电影都引用相同的Actor 实例。此外,当Actor 添加到Movie 的cast 数组时,Movie 将附加到Actor 的filmography 数组。这是我到目前为止的代码:
public var allActors = [String: Actor]()
public final class Actor {
public let name: String
public var filmography: [Movie]
public init(name: String, filmography: [Movie] = Array()) {
self.name = name
self.filmography = filmography
}
}
public final class Movie: Codable {
public let title: String
public var cast: [Actor]
enum CodingKeys: String, CodingKey {
case title
case cast
}
public init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: CodingKeys.self)
title = try values.decode(String.self, forKey: .title)
cast = Array() // fourth line of this initializer
cast = try values.decode([String].self, forKey: .cast).map {
let actor: Actor
if let recurringActor = allActors[$0] {
actor = recurringActor
} else {
let newActor = Actor(name: $0)
allActors[$0] = newActor
actor = newActor
}
actor.filmography.append(self)
return actor
}
}
public func encode(to encoder: Encoder) throws {
var container = encoder.container(keyedBy: CodingKeys.self)
try container.encode(title, forKey: .title)
try container.encode(cast.map {$0.name}, forKey: .cast)
}
}
但是,此代码有效,但在 Movie 的 init(from:) 初始化程序的第四行,cast 设置为空数组。这似乎是多余的,但如果我删除它,我会收到以下错误:
在所有成员初始化之前被闭包捕获的'self'
有没有办法避免这个错误?我没有使用self 的任何属性,所以我不明白为什么不能在闭包中使用Movie 的引用。
【问题讨论】:
-
allActors 是在哪里声明的?你能发布你的 JSON 字符串吗?
-
你可以简单地用一个空数组初始化你的
cast。var cast: [Actor] = [] -
@LeoDabus allActors 声明在代码围栏的顶部。 JSON 文件在这里:pastebin.com/XjGD5q2g