Search
Duplicate

Result Type

์ƒ์„ฑ์ผ
2023/07/12 14:18
ํƒœ๊ทธ
Swift

Result Type

Result ํƒ€์ž…์— ๋Œ€ํ•œ ์ดํ•ด

โ€ข
์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ, ์—๋Ÿฌ๋ฅผ ๋”ฐ๋กœ ์™ธ๋ถ€๋กœ ๋˜์ง€๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ๋ฆฌํ„ด ํƒ€์ž… ์ž์ฒด๋ฅผ Result Type(2๊ฐ€์ง€๋ฅผ ๋‹ค ๋‹ด์„ ์ˆ˜ ์žˆ๋Š”)์œผ๋กœ ๊ตฌํ˜„ํ•ด์„œ ํ•จ์ˆ˜ ์‹คํ–‰์˜ ์„ฑ๊ณต๊ณผ ์‹คํŒจ์˜ ์ •๋ณด๋ฅผ ํ•จ๊ป˜ ๋‹ด์•„์„œ ๋ฆฌํ„ด
โ€ข
๋ณด๋‹ค ์ง„๋ณด๋œ ํ˜•ํƒœ์˜ ์—๋Ÿฌ ์ฒ˜๋ฆฌ ํƒ€์ž…
โ€ข
์‹ค์ œ Result ํƒ€์ž…์˜ ๋‚ด๋ถ€ ๊ตฌํ˜„
โ—ฆ
enum Result<Success, Failure> where Failure: Error
โ€ข
Result ํƒ€์ž…์€ ์—ด๊ฑฐํ˜•
โ—ฆ
case success (์—ฐ๊ด€๊ฐ’)
โ—ฆ
case failure (์—ฐ๊ด€๊ฐ’)
func doSomething(a: Int) -> Result<Bool, SomeError> { ... }
โ€ข
์—๋Ÿฌ๋ฅผ ๋˜์งˆ ํ•„์š”๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— throws ํ‚ค์›Œ๋“œ ๋ถˆํ•„์š”

Result ํƒ€์ž…์„ ํ™œ์šฉํ•œ ์—๋Ÿฌ์˜ ์ฒ˜๋ฆฌ

โ€ข
์—๋Ÿฌ๋Š” ๋™์ผํ•˜๊ฒŒ ์ •์˜๋˜์–ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •
โ€ข
Result ํƒ€์ž…์—๋Š” ์„ฑ๊ณต/์‹คํŒจํ–ˆ์„ ๊ฒฝ์šฐ์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ๋‹ค ๋“ค์–ด์žˆ์Œ:
func resultTypeCheckingHeight(height: Int) -> Result<Bool, HeightError> { if height > 190 { return Result.failure(HeightError.maxHeight) } else if height < 130 { return Result.failure(HeightError.minHeight) } else { if height >= 160 { return Result.success(true) } else { return Result.success(false) } } } // ๋ฆฌํ„ด๊ฐ’์„ ๋ฐ›์•„์„œ let result = resultTypeCheckingHeight(height: 200) // ์ฒ˜๋ฆฌ switch result { case .success(let data): print("๊ฒฐ๊ณผ๊ฐ’์€ \(data)์ž…๋‹ˆ๋‹ค.") case .failure(let error): print(error) }
Swift
๋ณต์‚ฌ

Result ํƒ€์ž…์˜ ๋‹ค์–‘ํ•œ ํ™œ์šฉ

โ€ข
Result ํƒ€์ž…์—๋Š” ์—ฌ๋Ÿฌ ๋ฉ”์„œ๋“œ๊ฐ€ ์กด์žฌ
โ€ข
get() ๋ฉ”์„œ๋“œ๋Š” ๊ฒฐ๊ณผ๊ฐ’์„ throwing ํ•จ์ˆ˜์ฒ˜๋Ÿผ ๋ณ€ํ™˜ ๊ฐ€๋Šฅํ•œ ๋ฉ”์„œ๋“œ (Success value๋ฅผ ๋ฆฌํ„ด)
do { let data = try result.get() print("๊ฒฐ๊ณผ๊ฐ’์€ \(data)์ž…๋‹ˆ๋‹ค.") } catch { print(error) }
Swift
๋ณต์‚ฌ

Result ํƒ€์ž…์„ ์™œ ์‚ฌ์šฉํ• ๊นŒ?

โ€ข
์„ฑ๊ณต/์‹คํŒจ์˜ ๊ฒฝ์šฐ๋ฅผ ๊น”๋”ํ•˜๊ฒŒ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•œ ํƒ€์ž…
โ€ข
๊ธฐ์กด์˜ ์—๋Ÿฌ์ฒ˜๋ฆฌ ํŒจํ„ด์„ ์™„์ „ํžˆ ๋Œ€์ฒดํ•˜๋ ค๋Š” ๋ชฉ์ ์ด ์•„๋‹ˆ๋ผ, ๊ฐœ๋ฐœ์ž์—๊ฒŒ ์—๋Ÿฌ ์ฒ˜๋ฆฌ์— ๋Œ€ํ•œ ๋‹ค์–‘ํ•œ ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์˜ต์…˜์„ ์ œ๊ณต
โ€ข
์ผ๋ฐ˜ ์—๋Ÿฌ ์ฒ˜๋ฆฌ์˜ ๊ฒฝ์šฐ์—๋Š” ๋น„์ •์ƒ์ ์ธ ๊ฒฝ์šฐ์— ์—๋Ÿฌ๋ฅผ ๋˜์ง€๊ณ , ์‹ค์ œ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ถ€๋ถ„์—์„œ try, do-catch๋ฌธ์œผ๋กœ ์ฒ˜๋ฆฌ
โ—ฆ
์‹ค์ œ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ณณ์—์„œ ์—๋Ÿฌ ํ˜•์‹์„ ํŠน์ •์ง“๊ธฐ๊ฐ€ ์–ด๋ ค์› ๋‹ค.
โ€ข
Result Type์„ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ์—๋Š”, ๋ฆฌํ„ด ํƒ€์ž…์ด ์„ฑ๊ณต(์ •์ƒ์ ์ธ ๊ฒฝ์šฐ)๊ณผ ์‹คํŒจ(์—๋Ÿฌ)์˜ ์ •๋ณด๋ฅผ ๋ชจ๋‘ ๋‹ด์„ ์ˆ˜ ์žˆ๋Š” ์—ด๊ฑฐํ˜•์ธ Result Type์œผ๋กœ ๋ฆฌํ„ด
โ—ฆ
์‹ค์ œ ํ•จ์ˆ˜ ์ •์˜ ์‹œ์— ์—๋Ÿฌ ํƒ€์ž…์„ ๋ช…์‹œ์  ์„ ์–ธ / ํƒ€์ž…์บ์ŠคํŒ…์ด ๋ถˆํ•„์š”ํ•˜๋‹ค.

๋„คํŠธ์›Œํ‚น ์ฝ”๋“œ์—์„œ์˜ Result Type

Result ํƒ€์ž… ์‚ฌ์šฉํ•˜๊ธฐ ์ „
// ํŠœํ”Œํƒ€์ž…์„ ํ™œ์šฉ, ๋ฐ์ดํ„ฐ ์ „๋‹ฌ func performRequest(with url: String, completion: @escaping (Data?, NetworkError?) -> Void) { guard let url = URL(string: url) else { return } URLSession.shared.dataTask(with: url) { (data, response, error) in if error != nil { print(error!) // ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Œ์„ ์ถœ๋ ฅ completion(nil, .someError) // ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ์œผ๋‹ˆ, nil ์ „๋‹ฌ return } guard let safeData = data else { completion(nil, .someError) // ์•ˆ์ „ํ•˜๊ฒŒ ์˜ต์…”๋„ ๋ฐ”์ธ๋”ฉ์„ ํ•˜์ง€ ๋ชปํ–ˆ์œผ๋‹ˆ, ๋ฐ์ดํ„ฐ๋Š” nil ์ „๋‹ฌ return } completion(safeData, nil) }.resume() } performRequest(with: "์ฃผ์†Œ") { data, error in // ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์„œ ์ฒ˜๋ฆฌ if error != nil { print(error!) } // ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ๊ด€๋ จ ์ฝ”๋“œ }
Swift
๋ณต์‚ฌ
Result ํƒ€์ž… ์‚ฌ์šฉ ํ›„
func performRequest2(with urlString: String, completion: @escaping (Result<Data, NetworkError>) -> Void) { guard let url = URL(string: urlString) else { return } URLSession.shared.dataTask(with: url) { (data, response, error) in if error != nil { print(error!) // ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Œ์„ ์ถœ๋ ฅ completion(.failure(.someError)) // ์‹คํŒจ ์ผ€์ด์Šค ์ „๋‹ฌ return } guard let safeData = data else { completion(.failure(.someError)) // ์‹คํŒจ ์ผ€์ด์Šค ์ „๋‹ฌ return } completion(.success(safeData)) // ์„ฑ๊ณต ์ผ€์ด์Šค ์ „๋‹ฌ }.resume() } performRequest2(with: "์ฃผ์†Œ") { result in switch result { case .failure(let error): print(error) case .success(let data): // ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ๊ด€๋ จ ์ฝ”๋“œ break } }
Swift
๋ณต์‚ฌ