はじめに
情報科学専門学校3年生のごみちゃんです!
今回は普段何気なく使っていた@escapingについてまとめてみました!
@escapingとは
@escapingはクロージャを破棄せずに取っておいてくれる便利な機能で、非同期処理などを行う際によく書かれる
APIを叩いたり、データベースを使うときは即座に処理を終えられない可能性が出てくるので、引数に(completion: @escaping () -> Void)と記述して、completionでAPIで取得した値、またはエラーを返す
func getUserInfo(email: String, completion: @escaping (Result<UserInfo, Error>) -> Void) {
if let tokenData = KeychainManager.shared.get(service: "BOOK APP", account: email),
let token = String(data: tokenData, encoding: .utf8) {
let headers: HTTPHeaders = [
"Authorization": "Bearer \(token)",
]
AF.request("https://***/***/***”, method: .get, headers: headers).responseDecodable(of: UserInfo.self) { response in
switch response.result {
case .success(let userInfo):
completion(.success(userInfo))
case .failure(let error):
completion(.failure(error))
}
}
} else {
print("No token available")
}
}
上記のコードは実際に@escapingを用いて書いた処理(エンドポイントは隠してる)
(Result)のResultはAlamofireで用意されているライブラリで、<構造体名, Error>という感じで書くと通信が成功した場合は指定した構造体として返して、失敗した場合はエラーを返すことができる
トークンの取得はKeychain用いていて、書くのが面倒なので後日まとめる
AlamofireでAPI通信を行い、switch文でレスポンスの状態を判断し、デコードしたjsonを返すかエラーを返すか決めている
func userInfoSet() {
UserAPIClient.shared.getUserInfo(email: email) { result in
switch result {
case .success(let userInfo):
self.userName.text = userInfo.name
case .failure(let error):
print("Error occurred: \(error.localizedDescription)")
}
}
}
呼び出しもとはこのようなコードになっている
completionで受け取ったresultをもとに再度switch文で成功か失敗か判断する
@escapingは古くからSwiftに存在する属性で、色々なライブラリとの互換性があり、エラーハンドリングも書きやすいので、覚えておくと便利かも