我相信我误解了 Swift 中的某些概念,可以将接收到的数组分配给我的实例变量。有人可以解释为什么我的 announcementsList
数组总体上有 0 个元素吗?
UIViewController.swift
var announcementsList: [Announcement] = []
override func viewDidLoad() {
super.viewDidLoad()
api.getAnnouncements(){ announcements in //<- announcements is array which has 12 elements
for ann in announcements{
self.announcementsList.append(ann)
}
}
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return announcementsList.count //<- have 0 here
}
API.swift
func getAnnouncements(completion: @escaping ([Announcement]) -> ()){
var announcements: [Announcement] = []
let url = URL(string: "https://api.ca/announcements")!
let task = self.session.dataTask(with: url) {
data, response, error in
if let data = data,
let json = try? JSONSerialization.jsonObject(with: data, options: []) as? [String: Any] {
guard let announcements_json = json!["announcements"] as? [[String: Any]]
else { return }
for announcement in announcements_json{
let title = announcement["title"] as! String
let desc = announcement["description"] as! String
announcements.append(Announcement(title: title,desc: desc))
}
}
completion(announcements)
}
task.resume()
}
P.S.:在我的辩护中,我应该说代码在 Java 中运行得很好
UPD
在 UIViewController.swift 中,如果在 viewWillDisappear()
中浏览我的 announcementsList
,我将在那里获取我的对象。所以我假设 tableView()
开始计数元素,然后它们在 viewDidLoad()
中被重新分配。
现在的问题是如何将 viewDidLoad()
中的对象分配给新数组,而不是 tableView()
开始计算它们。
最佳答案
var announcementsList: [Announcement] = [] {
didSet {
DispatchQueue.main.async {
self.tableView.reloadData()
}
}
}
override func viewDidLoad() {
super.viewDidLoad()
api.getAnnouncements { announcements in
self.announcementsList = announcements
}
}
关于ios - swift 将从@escaping 接收到的值分配给另一个类中的实例变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52395322/