✨
[swift] 引数付きの Closure で値を受け渡す
こちらの記事で Closure について少し触れた内容に少し補足を行います。
この記事では、このような Closure を作成しました。
override func viewDidLoad() {
super.viewDidLoad()
getUsers { [weak self] in
self?.showUsers()
}
}
func getUsers(completion: @escaping () -> Void) {
let db = Firestore.firestore()
db.collection("users").getDocuments { (querySnapshot, err) in
if let err = err {
print("Error getting documents: \(err)")
} else {
userDocuments = querySnapshot!.documents
completion()
}
}
}
func showUsers() {
// ここに userDocuments を使うコードが書いてある
}
この関数では userDocuments というインスタンス変数に
通信結果を代入するようにしてありますが、他の実装方法もあります。
以下に示します。
override func viewDidLoad() {
super.viewDidLoad()
getUsers { [weak self] queryDocumentSnapshot in
self?.showUsers(queryDocumentSnapshot: queryDocumentSnapshot)
}
}
func getUsers(completion: @escaping ([QueryDocumentSnapshot]) -> Void) {
let db = Firestore.firestore()
db.collection("users").getDocuments { (querySnapshot, err) in
if let err = err {
print("Error getting documents: \(err)")
} else {
let userDocuments = querySnapshot!.documents
completion(userDocuments)
}
}
}
func showUsers(queryDocumentSnapshot: [QueryDocumentSnapshot]) {
// ここに userDocuments を使うコードが書いてある
}
このように () -> Void
から ([QueryDocumentSnapshot]) -> Void
に変更することで
completion(userDocuments)
という風に値を渡して
getUsers { [weak self] queryDocumentSnapshot in
で受け取ることが出来るようになっています。
Discussion