Arrays 更改嵌入在数组中的静态变量?
我有一系列视频供用户选择。在任何时候,我都希望能够通过调用Arrays 更改嵌入在数组中的静态变量?,arrays,swift,static,Arrays,Swift,Static,我有一系列视频供用户选择。在任何时候,我都希望能够通过调用video.setupFull.waved来访问video属性,并确定它是否为nil。我创建了一个结构,然后使用静态变量来创建每个视频 这是我的设置代码: struct Video { let name: String let image: String let firebaseID: String let number: Int let url: String let desc: Stri
video.setupFull.waved
来访问video属性,并确定它是否为nil
。我创建了一个结构,然后使用静态变量来创建每个视频
这是我的设置代码:
struct Video {
let name: String
let image: String
let firebaseID: String
let number: Int
let url: String
let desc: String
var playbackTime: TimeInterval?
var watched: Bool?
var watchedDate: TimeInterval?
static let setupFull = Video(name: "Setup Full",
image: "Setup Full",
firebaseID: "setupTutorialFull",
number: 300928943,
url: "https://player.vimeo.com/external/282034045",
desc: "Moneypants Setup Tutorial Full")
static let step1Income = Video(name: "Step 1 - Income",
image: "Step 1 Income",
firebaseID: "step1Income",
number: 282034041,
url: "https://player.vimeo.com/external/282034041",
desc: "Moneypants Setup Tutorial (Step 1) - Income")
static let step2FamilyMembers = Video(name: "Step 2 - Family Members",
image: "Step 2 Family Members",
firebaseID: "step2FamilyMembers",
number: 282600740,
url: "https://player.vimeo.com/external/282600740",
desc: "Moneypants Setup Tutorial (Step 2) - Family Members")
static var array = [setupFull, step1Income, step2FamilyMembers]
}
为了节省空间,我只在Firebase上存储视频对象的可选参数(playbackTime
、watched
、以及watchedDate
),如下所示:
{
"setupTutorialFull" : {
"playbackTime" : 194,
"watched" : true,
"watchedDate" : 1550004207
},
"step1Income" : {
"playbackTime" : 10,
"watched" : true,
"watchedDate" : 1544566787
},
"step2FamilyMembers" : {
"playbackTime" : 22,
"watched" : true,
"watchedDate" : 1544589461
}
}
static func observeDB(completion: @escaping () -> Void) {
FB.ref
.child(FB.videos)
.observe(.value) { (snapshot) in
for item in snapshot.children {
guard let snap = item as? DataSnapshot else { return }
guard let value = snap.value as? [String: Any] else { return }
let videoID = snap.key
let playbackTime = value[FB.playbackTime] as? TimeInterval
let watched = value[FB.watched] as? Bool
let watchedDate = value[FB.watchedDate] as? TimeInterval
// Find the appropriate video and update its variables.
if let index = array.firstIndex(where: { $0.firebaseID == videoID }) {
array[index].playbackTime = playbackTime
array[index].watched = watched
array[index].watchedDate = watchedDate
}
}
completion()
}
}
(请注意,列表中的所有视频都已观看。)
我想在最初加载数据时进行批量更新,因此我制作了视频阵列,并尝试如下方式进行更新:
{
"setupTutorialFull" : {
"playbackTime" : 194,
"watched" : true,
"watchedDate" : 1550004207
},
"step1Income" : {
"playbackTime" : 10,
"watched" : true,
"watchedDate" : 1544566787
},
"step2FamilyMembers" : {
"playbackTime" : 22,
"watched" : true,
"watchedDate" : 1544589461
}
}
static func observeDB(completion: @escaping () -> Void) {
FB.ref
.child(FB.videos)
.observe(.value) { (snapshot) in
for item in snapshot.children {
guard let snap = item as? DataSnapshot else { return }
guard let value = snap.value as? [String: Any] else { return }
let videoID = snap.key
let playbackTime = value[FB.playbackTime] as? TimeInterval
let watched = value[FB.watched] as? Bool
let watchedDate = value[FB.watchedDate] as? TimeInterval
// Find the appropriate video and update its variables.
if let index = array.firstIndex(where: { $0.firebaseID == videoID }) {
array[index].playbackTime = playbackTime
array[index].watched = watched
array[index].watchedDate = watchedDate
}
}
completion()
}
}
但是,令我沮丧的是,静态变量不会在数组更新时更新
print(Video.setupFull.watched) // prints `nil`
print(Video.array[0].watched) // prints `true`
现在,如果我直接手动修改静态变量,它会更新。当然,这是意料之中的
Video.setupFull.watched = true
print(Video.setupFull.watched) // prints `true`
问题是我可能有数百个视频要更新,但我不想手动更新每一个。这就是我创建静态数组的原因。这样我就可以迭代数组并快速更新视频。我希望能够在单独的视图控制器上调用Video.setupFull.waved
,并将其显示为waved
我的问题是:为什么静态变量嵌入数组时不更新?为什么我不能使用Video.array[0]。waved=true
并更新基础Video.setupFull.waved
对象
我以为structs就是这样工作的。它们不创建副本,但可以直接修改。我缺少什么?你错了,结构是值类型,总是创建一个副本。类是引用类型,并且是可修改的。@TusharSharma,那么你建议我使用类重做代码吗?我想我不明白。我在我的应用程序的其他地方使用了static var
,我可以从其他类和视图控制器中更新它。是因为我将它们嵌入了一个数组中,这就是创建一个副本吗?一般来说,全局(静态)变量很难使用,在这里您已经成功创建了副本。我的快速修复建议是跳过单个静态对象,只有一个静态数组,并在创建数组时实例化视频对象。@JoakimDanielson,谢谢你的想法。创建数组时,如何实例化视频对象?它们是否可以作为Video.setupFull.waved
访问,或者我是否只能通过数组(laVideo.array[0]。waved
)访问它们?