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
๋ณต์ฌ