gpt4 book ai didi

ios - init 不调用自定义类 swift

转载 作者:可可西里 更新时间:2023-11-01 02:19:24 25 4
gpt4 key购买 nike

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() 方法实际上被调用了。试试这段代码:

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)
}

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

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
}
}
}

关于ios - init 不调用自定义类 swift,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32033811/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com