1. ๊ฐœ๋…

์„ฑ๊ณต๊ณผ ์‹คํŒจ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” 2๊ฐ€์ง€์˜ ๊ฒฝ์šฐ๋ฅผ ๊ฐ€์ง€๋ฉฐ, ๊ฐ๊ฐ์˜ ๊ฒฝ์šฐ์— ์—ฐ๊ด€๊ฐ’์„ ํฌํ•จํ•˜๋Š” ํƒ€์ž…์ด๋‹ค.

 

2. ํŠน์ง•

  • throws ํ‚ค์›Œ๋“œ์™€ ๋น„์Šทํ•˜์ง€๋งŒ, ์˜ค๋ฅ˜๋ฅผ ์ €์žฅํ•˜๊ณ  ๋‚˜์ค‘์— ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์˜ค๋ฅ˜๋ฅผ ๊ฐ•๋ ฅํ•˜๊ฒŒ ํƒ€์ž… ์ฒดํฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋ชจ๋“  ๊ฒฝ์šฐ๋ฅผ ๋‹ค๋ฃจ๊ธฐ ๋•Œ๋ฌธ์— ์˜ค๋ฅ˜๋ฅผ ๋†“์น˜๋Š” ์ผ์ด ์—†๋‹ค.
  • ์‹ค์ œ ์—๋Ÿฌ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ์ƒํƒœ(state)๋ณด๋‹ค ๋” ๋งŽ์€ ๋ถˆํ•„์š”ํ•œ ์ƒํƒœ๋ฅผ ์ถ”๊ฐ€๋กœ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋‹จ์ง€ ์ฒ˜๋ฆฌํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฒฐ๊ณผ์˜ ์ƒํƒœ๋Š” ์„ฑ๊ณต๊ณผ ์‹คํŒจ์ผ ๋ฟ์ธ๋ฐ, ์ด๋Ÿด ๋•Œ result ํƒ€์ž…์„ ์“ฐ๋ฉด ๋œ๋‹ค.

 

3. ์ฝ”๋“œ

  • ๊ธฐ์กด์— do-catch, try, throw๋ฅผ ํ†ตํ•ด ์—๋Ÿฌ ์ฒ˜๋ฆฌํ–ˆ๋˜ ์ฝ”๋“œ
import Foundation

enum FileError: Error {
    case fileNotFound
    case unreadable
    case encodingFailed
}

func readFile(at path: String) throws -> String {
    guard let fileURL = URL(string: path) else {
        throw FileError.fileNotFound
    }
    
    guard let fileContents = try? String(contentsOf: fileURL) else {
        throw FileError.unreadable
    }
    
    if fileContents.isEmpty {
        throw FileError.encodingFailed
    }
    
    return fileContents
}

do {
    let content = try readFile(at: "path/to/file.txt")
    print("ํŒŒ์ผ ๋‚ด์šฉ: \\(content)")
} catch FileError.fileNotFound {
    print("ํŒŒ์ผ์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.")
} catch FileError.unreadable {
    print("ํŒŒ์ผ์„ ์ฝ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.")
} catch FileError.encodingFailed {
    print("ํŒŒ์ผ ๋‚ด์šฉ์„ ์ธ์ฝ”๋”ฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.")
} catch {
    print("์˜ˆ์ƒ์น˜ ๋ชปํ•œ ์˜ค๋ฅ˜: \\(error).")
}

 

  • result ์ ์šฉํ•œ ์ฝ”๋“œ
import Foundation

enum FileError: Error {
    case fileNotFound
    case unreadable
    case encodingFailed
}

func readFile(at path: String, completion: @escaping (Result<String, FileError>) -> Void) {
    guard let fileURL = URL(string: path) else {
        completion(.failure(.fileNotFound))
        return
    }
    
    guard let fileContents = try? String(contentsOf: fileURL) else {
        completion(.failure(.unreadable))
        return
    }
    
    if fileContents.isEmpty {
        completion(.failure(.encodingFailed))
        return
    }
    
    completion(.success(fileContents))
}

readFile(at: "path/to/file.txt") { result in
    switch result {
    case .success(let content):
        print("ํŒŒ์ผ ๋‚ด์šฉ: \\(content)")
    case .failure(let error):
        switch error {
        case .fileNotFound:
            print("ํŒŒ์ผ์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.")
        case .unreadable:
            print("ํŒŒ์ผ์„ ์ฝ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.")
        case .encodingFailed:
            print("ํŒŒ์ผ ๋‚ด์šฉ์„ ์ธ์ฝ”๋”ฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.")
        }
    }
}

 

4. ์ฐธ๊ณ  ์ž๋ฃŒ

'Swift ๊ธฐ๋ณธ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[Swift] Hashable ํ”„๋กœํ† ์ฝœ  (0) 2024.05.24
[Swift] enumerated()  (0) 2024.05.24
[Swift] ์—ด๊ฑฐํ˜•(Enumeration)  (0) 2024.02.26
[Swift] ํƒ€์ž… ์บ์ŠคํŒ…(Type Casting)  (0) 2024.02.02
user-img ๋“คํŒ์„์ง€๋‚˜๋Šช์ง€๋Œ€๋ฅผ๊ฑด๋„ˆ
kiln
ํ˜„์žฌ๊ธ€
[Swift] Result
ํ•จ๊ป˜ ๋ณด๋ฉด ์ข‹์„ ํฌ์ŠคํŠธ