Avatar
03A // サーバーから JSON を取得し、 // User インスタンスをデコードし、 // それに加えて User が保持する thumbnailURL から // サムネイル画像をダウンロードする非同期関数 // fetchUserWithThumbnail を完成させて下さい。 import Foundation import FoundationNetworking struct User: Identifiable, Codable { typealias ID = Int let id: ID var name: String var thumbnailURL: URL } func download(from url: URL, completion: @escaping (Result<Data, Error>) -> Void) { do { let data: Data = try Data(contentsOf: url) completion(.success(data)) } catch { completion(.failure(error)) } } func fetchUserWithThumbnail(for id: User.ID, completion: @escaping (Result<(user: User, thumbnail: Data), Error>) -> Void) { let url: URL = URL(string: "https://koherent.org/async-await-challenge/api/user?id=\(id.description)")! // 🚧 ここを実装する } fetchUserWithThumbnail(for: 123) { result in do { let (user, thumbnail) = try result.get() print(user.name, thumbnail.count) } catch { print(error) } }
🙇‍♂️ 1
1:19 PM
03B // サーバーから JSON を取得し、 // User インスタンスをデコードし、 // それに加えて User が保持する thumbnailURL から // サムネイル画像をダウンロードする非同期関数 // fetchUserWithThumbnail を完成させて下さい。 import Foundation import FoundationNetworking struct User: Identifiable, Codable { typealias ID = Int let id: ID var name: String var thumbnailURL: URL } func download(from url: URL) async throws -> Data { let data: Data = try Data(contentsOf: url) return data } func fetchUserWithThumbnail(for id: User.ID) async throws -> (user: User, thumbnail: Data) { let url: URL = URL(string: "https://koherent.org/async-await-challenge/api/user?id=\(id.description)")! // 🚧 ここを実装する } runAsyncAndBlock { do { let (user, thumbnail) = try await fetchUserWithThumbnail(for: 123) print(user.name, thumbnail.count) } catch { print(error) } }
1:20 PM
@swift-main -Xfrontend -enable-experimental-concurrency // サーバーから JSON を取得し、 // User インスタンスをデコードする // 非同期関数 fetchUser を完成させて下さい。 // // サーバーから JSON を取得するには // download 関数を用います。 // download の実装は擬似的なものですが // 変更せずにそのまま利用して下さい。 // // なお、通信やデコードに起因するエラーは // 起こらないものとします。 import Foundation import FoundationNetworking struct User: Identifiable, Codable { typealias ID = Int let id: ID var name: String var thumbnailURL: URL } func download(from url: URL) async -> Data { let data: Data = try! Data(contentsOf: url) return data } func fetchUser(for id: User.ID) async -> User { let url: URL = URL(string: "https://koherent.org/async-await-challenge/api/user?id=\(id.description)")! let data = await download(from: url) let user: User = try! JSONDecoder().decode(User.self, from: data) return user } runAsyncAndBlock { let user = await fetchUser(for: 123) print(user.name) }