初始化未调用自定义 a class swift

init not called on custom a class swift

class Facts {
    var networkOperaton = NetworkOperation(url: "http://fact.tayfunturanligil.com")
    var factsArray : [String] = []
    init () {
        self.networkOperaton.downloadJSONFromURL({
            (a:[String]) -> [String] in
            println(a)
            self.factsArray = a
            return a
        })
    }
}

当我想使用 var facts = Facts() 在我的 ViewController 中创建 Facts 实例时,factsArray 保持为空数组。但它应该从 downloadJSONFromURL 函数中获取一个数组。为什么会这样?连我的println(a)都不叫。

我在 playground 中测试了 downloadJSONFromURL 功能并且它有效。另外,networkOperation 使用 NSURLSession,这会是个问题吗?

init() 被调用,但 downloadJSONFromURL() 是一个异步方法。
这意味着 init() returns 在调用 downloadJSONFromURL() 后立即 Facts 实例而不等待完成。

实际上调用了init()方法。试试这个代码:

class Facts {
   var factsArray : [String] = []
   init () {
       println("Init called")
       factsArray = ["Hello", "World", "Bye", "World"]
   }
}

ViewController.swift:

override func viewDidLoad() {
    super.viewDidLoad()

    var facts = Facts()
    println(facts.factsArray)
}

您的代码存在的问题是网络操作在异步模式下会 运行。您可以在函数中定义另一个方法,而不是在 init 方法中发出网络请求,然后可以 return 完成块中的请求状态。

func updateArrayFromNetwork(completion: (Bool) -> ()) {
    var networkOperaton = NetworkOperation(url: "http://fact.tayfunturanligil.com")
    self.networkOperaton.downloadJSONFromURL({
        (a:[String]) -> [String] in
        println(a)
        self.factsArray = a
        completion(true)
    })
}

ViewController.swift

override func viewDidLoad() {
    super.viewDidLoad()

    var facts = Facts()
    println(facts.factsArray)

    facts.updateArrayFromNetwork { (completed: Bool) -> () in
        if completed {
            //Do something
        }
    }
}