Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 更改嵌入在数组中的静态变量?_Arrays_Swift_Static - Fatal编程技术网

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
访问,或者我是否只能通过数组(la
Video.array[0]。waved
)访问它们?