当他们具有变异功能时,我很难使用swift Structure。在这个例子中,我有一个MediaManager
来获取一些数据,将它们存储到它的实例变量中,并在我重新加载UI时调用一个完成。
public struct MediaManager {
//var store = MovieStore()
var movies = [String]()
mutating func fetchMovies(completion: (() -> Void) ) -> Void {
// fetch movies
NSOperationQueue.mainQueue().addOperationWithBlock() {
self.movies = ["Ant Man", "Batman"]
print("Movies in store \(self.movies)")
print("Movies in manager \(mediaManager.allMovies())")
completion()
}
}
public func allMovies() -> [String] {
return movies
}
}
问题是allMovies()
为空。
输出
Movies in store ["Ant Man", "Batman"]
Movies in manager []
我可以使用类而不是结构但我的理解是结构应该优先于swift中的类。什么是适当的解决方案?
欢呼声, 扬
答案 0 :(得分:3)
你有一个闭包,所以必须捕获闭包使用的每个变量,包括self
。但是,self
是值类型(struct),因此捕获意味着复制值。在执行闭包时,在结构的本地副本上设置movies
。
使用类(引用类型)。值类型绝不比引用类型更受欢迎。两者都有它们的用途。您找到了一个需要引用类型的用例。
答案 1 :(得分:0)
周围有很多非常相似的问题。你的fetchMovies函数立即返回。多数民众赞成....你添加一些块供以后执行,但在哪个时候会被执行?
是的,Sultan是对的,虽然您需要某种同步。你可以玩(按照苏丹推荐的参考类型)
import XCPlayground
XCPlaygroundPage.currentPage.needsIndefiniteExecution = true
import Foundation
public class MediaManager {
//var store = MovieStore()
var movies = [String]()
func fetchMovies(completion: (() -> Void) ) -> Void {
// fetch movies
NSOperationQueue.mainQueue().addOperationWithBlock() {
self.movies = ["Ant Man", "Batman"]
print("Movies in store \(self.movies)")
print("Movies in manager \(self.allMovies())")
completion()
}
}
public func allMovies() -> [String] {
return movies
}
}
var mm = MediaManager()
mm.fetchMovies { print("completed") }
print("after fetch:", mm.allMovies())
有了这个结果
after fetch: []
Movies in store ["Ant Man", "Batman"]
Movies in manager ["Ant Man", "Batman"]
completed