Programming/Swift(iOS)

Swift 오류처리 -3

홍열 2021. 4. 6. 13:10
728x90

Error처리를 한 군데에서 하면 중복된 코드를 방지할 수 있어 가독성을 높일 수 있습니다.

 

Singleton

- 'default' 

=> swift에 default keyword가 지정되어 있어 quota로 다르다는것을 표시 

- shared : private로 제한을 걸어 생성을 불가능하게 한다. 

struct ErrorHandler {
    static let `default` = ErrorHandler()

    func handle(_ error:Error) {
        print(error)
    }
}

 

타입을 생성할 때, Data의 유효성을 미리 검증해 볼 수 있다면 이후의 오류 처리를 줄일 수 있습니다. 

 

에러 원인이 2개 이상일 경우 오류 처리를 하는 것이 좋고, 단일이라면 Optional 처리를 하는것이 편리합니다. 

 

1. 에러 처리 (do ~ catch)

//Error 원인이 2개 이상 
enum UserError : Error {
    case emptyValueNotAllowed
    case invalidEmail
}

struct User {
    let email : String
    
    init(email:String) throws {
        if email.isEmpty {
            throw UserError.emptyValueNotAllowed
        }
        
        let pattern = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,64}"
        
        // 정규 표현식으로 email 검사
        if email.range(of:pattern, options: .regularExpression, range:nil, locale:nil) == nil  {
            throw UserError.emptyValueNotAllowed
        }
        self.email = email
    }

do {
    let user = try User(email: ".com")
} catch {
    print(error)
}

2. 실패 가능한 초기화 이용

struct User {
    let email : String

    //실패 가능한 초기화
    init?(email:String) {
        let pattern = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,64}"
        
        // 정규 표현식으로 email 검사
        if email.range(of:pattern, options: .regularExpression, range:nil, locale:nil) == nil  {
            return nil
        }
        self.email = email
    }
}

if let user = User(email:"hello@") {
   print(user)
} else {
    print("생성실패")
}

 

 

3. try

- try : 오류를 외부로 전달 (do ~ catch)

- try! : 오류 발생시 프로그램 종료

- try? : 오류를 던질지 말지 선택하면 됨 (optional 처럼 사용)

if let user = try? User(email:"hello@") {
    print(user)
} else {
    print("생성 실패")
}