ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Swift 오류 처리 - 1
    Programming/Swift(iOS) 2021. 4. 6. 09:38
    728x90

    Swift에는 오류를 처리할 수 있는 방법들이 많이 있습니다. 

    Error Protocol을 구현해주면 되는데요. 

     

    에러는 상호 베타적이기때문에, 한 에러가 발생하면 다른 에러는 발생하지 않아야합니다. 

    -> Enum을 가지고 구현하면 편합니다. 

     

    추가적인 정보가 필요한 경우에는 struct나 class도 가능합니다. 

     

    에러에 대한 정보는 함수 위에 미리 넣어주는게 좋습니다. (Command + option + /)

    enum ParseLocationError:Error {
        case invalidData
        case network(String)
        case locationDoesNotExist
    }
    
    struct Location {
        let latitude:Double
        let longitude:Double
    }
    
    
    /// 유요한 위치인지 확인
    /// - Parameters:
    ///   - latitude: 위도
    ///   - longitude: 경도
    /// - Throws: 유효하지 않은 데이터인 경우, invalidData를 발생시킵니다.
    /// - Returns: Location
    func parseLocation(_ latitude:String, _ longitude:String) throws -> Location {
        guard let latitude = Double(latitude), let longitude = Double(longitude) else {
            throw ParseLocationError.invalidData
        }
        
        return Location(latitude: latitude, longitude: longitude)
    }

     

    parseLocation은 에러가 발생하면 throws를 통해서 ParseLocationError을 던지도록 되어 있습니다.

     

    throws를 받으려면 어떻게 해야될까요?

     

    1. try funtion() 

    -> error가 발생하면 프로그램이 비정상종료됩니다.

    try parseLocation("a", "b")

    2. do ~ catch

    -> error가 catch block에 전달되므로 처리가 가능합니다. 

    catch에는 error의 최상위 타입이 전달됩니다. 따라서 switch로 구분하고, 우리가 정의한 Error이외의 Error가 더 올수 있으므로 항상 default를 같이 표시해줍니다. 

    do {
        let loc:Location = try parseLocation("A", "23.23")
    } catch let error{
        print(error)
    }
    
    do {
        let location = try parseLocation("A", "4.5")
        print(location)
    } catch {
        print(error)
        switch error {
        case ParseLocationError.invalidData:
            print("invalidData")
        case ParseLocationError.network(let message):
            print("netword = \(message)")
        case ParseLocationError.locationDoesNotExist:
            print("locationDoesNotExit")
        default:
            print("another error")
        }
    }
    
    // catch에서 에러의 종류로 직접 처리 가능하다.
    do {
        let location = try parseLocation("A", "4.5")
        print(location)
    } catch ParseLocationError.invalidData {
        print("invalidData")
    
    } catch ParseLocationError.network(let message) {
        print("netword = \(message)")
    } catch ParseLocationError.locationDoesNotExist {
        print("locationDoesNotExit")
    } catch {
        print("another error")
    }
    
    //에러의 타입을 기반으로 다른 처리를 하는것도 가능하다.
    
    do {
        let location = try parseLocation("A", "4.5")
        print(location)
    } catch let error as ParseLocationError {
        print(error)
    } catch {
        print(error)
    }
    

     

    만약 error가 발생했을 때, 처리하고 싶은 부분이 있으면 어떻게 해야될까요?

    java에서 finally같은 역할이 swift에도 있을까요?

     

    -> defer를 이용하시면 됩니다.

    'Programming > Swift(iOS)' 카테고리의 다른 글

    Swift 오류처리 - 3  (0) 2021.04.06
    Swift 오류 처리 - 2  (0) 2021.04.06
    Swift 상속  (0) 2021.04.03
    Swift 초기화 메서드  (0) 2021.04.02
    Swift Optional - 2  (0) 2021.04.02
Designed by Tistory.