Swift

时间:2015-12-13 14:59:58

标签: struct swift2

当他们具有变异功能时,我很难使用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中的类。什么是适当的解决方案?

欢呼声, 扬

2 个答案:

答案 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