在viewDidLoad()中进行Swift 4变量初始化

时间:2018-08-20 22:41:43

标签: swift

我是一名Swift新手,我遇到了一个让我很困扰的问题...

在下面的代码中:

class TestViewController: UIViewController {

  var userNames : [String] = {return DatabaseMethods.getUsers()}()

  override func viewDidLoad() {
    super.viewDidLoad()
    print(userNames)
  }
}

print语句每次都会打印一个空数组。 (I)我不确定为什么会这样,并且(II)我还没有找到解决此问题的方法。只是为了获得更多上下文,这是DatabaseMethods类的外观:

class DatabaseMethods {

static func getUsers() -> [String] {
    var userNames = [String]()
    db.collection("users").getDocuments() { (querySnapshot, err) in
        if let err = err {
            print("Error getting documents: \(err)")
        } else {
            for document in querySnapshot!.documents {
                let data = document.data()
                let first : String = data["First"] as! String
                let last : String = data["Last"] as! String
                userNames.append("\(first) \(last)")
            }
        }
    }
    return userNames
}

}

2 个答案:

答案 0 :(得分:0)

使用viewdidload方法进行请愿,我希望您的方法不执行,因为您没有在viewdidload中初始化,并且遇到了异步问题。尝试做这样的事情:

class TestViewController: UIViewController {

  var userNames : [String] = []

  override func viewDidLoad() {
    super.viewDidLoad()
    userNames = DatabaseMethods.getUsers()
    print(userNames)
  }
}

在您的代码中,您尝试创建一个惰性变量,而不仅仅是一个变量。

答案 1 :(得分:-2)

{}是异步的,这就是为什么需要闭包的原因。借助db.collection(“users“).getDocuments(),您可以使DispatchGroup保持同步,以便在通话结束时重新吸引所有用户。

getUsers()

由于数组是值类型,因此将返回一个空副本,因此使用旧方法将无法达到更新,因为值类型将被复制,而不是引用类型。