[swift] 引数付きの Closure で値を受け渡す

2022/01/08に公開

こちらの記事で Closure について少し触れた内容に少し補足を行います。
https://zenn.dev/yoneapp/articles/d378d9deef20d5

この記事では、このような 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