Class 适当的未在 swift 中分配

Class proper not assigned in swift

我正在练习,发现我的 class 属性(adNames) 无法分配。但是可以在外面赋值(我注释掉的地方)。这是我的代码:

import UIKit
import Alamofire
import SwiftyJSON

class AdTableViewController: UITableViewController {

    var adNames: [JSON]?

    override func viewDidLoad() {
        super.viewDidLoad()

        Alamofire.request(.GET, "http://codewithchris.com/code/afsample.json").responseJSON { (Response) -> Void in

            if let value = Response.result.value{

                let json = JSON(value)
                print(json["secondkey"].arrayValue) //["item1","item2","item3"] 
                self.adNames = json["secondkey"].arrayValue
            }
        }
//        self.adNames = ["item1", "item2", "item3"]
    }

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        if let names = adNames {
            return names.count
        }
        return 0
    }

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        ...
    }

}

谁能告诉我原因吗?谢谢!

您正在传递给请求调用的闭包中访问 self。在闭包内使用捕获列表来保存对 self 对象的引用。

[weak self] (Response) -> Void in(在这种情况下你必须使用 self? 来访问 self 实例) ...

[unowned self] (Response) -> Void in

如果您确定对象将在请求调用完成后出现。

您的 Alamofire 请求在后台运行。同时,您的 tableView 想要显示并调用 numberOfRowsInSection。这时候Alamofire还没有完成它的工作,所以adnames还没有设置。

设置 adNames 后,您需要使用 reloadData() 刷新 tableView。即

    Alamofire.request(.GET, "http://codewithchris.com/code/afsample.json").responseJSON { (Response) -> Void in
        if let value = Response.result.value{
            let json = JSON(value)
            self.adNames = json["secondkey"].arrayValue
            self.tableView.reloadData()
        }
    }

然后tableView会刷新,重新调用numberOfRowsInSection,此时adNames不会为nil。