본문 바로가기

IT/Swift

[swift] throw, do-catch, rethrows, defer

[swift 기초문법] - throw, do-catch, rethrows, defer

 

 

throw

throw 키워드를 쓰면 함수, 메서드, 이니셜라이저는 오류를 던질 수 있습니다.

throws 키워드를 사용한 함수는 동작 도중 오류가 발생하면 호출한 코드에 오류를 알릴 수 있습니다.

같은 이름의 throw가 명시되지 않은 함수와 구분됩니다.

throw를 포함한 메서드, 이니셜라이저는 메서드, 이니셜라이저로 재정의 될 수 없습니다.

반대의 경우는 가능합니다 (throw가 없는 함수가 있는 함수로 재정의)

 

enum ErrorReason: Error {

        case none

        case invalid

    }

    

    func vend() throws {

        var testError: Int? = nil

        guard let test = testError else {

            print("error guard syntax")

            throw ErrorReason.none

        }

        print("normal case")

 

    }

    

    func test() throws {

        try vend()

    }

 

throws 함수를 호출하는 함수는 호출하는 함수가 throws를 포함하거나 do-catch 구문을 사용하여 호출 할 수 있습니다.

 

 

 

 

do-catch

  do {

      try 오류 발생 가능 코드

  } catch 오류패턴 1 {

     오류 종류에 따른 대응 구현

  } catch { //에러의 종류를 명시하지 않고 코드 블록을 생성하면 블록 내부에 error라는 지역 상수가 암시적으로 생깁니다.

     print(error)

  }

 

func viewDidLoad() {

  do {

      try vend()  

  } catch {

     print(error)

  }

}

 

rethrows

throw와 비슷한 기능이나 rethrows는 매개변수로 전달받은 함수가 오류를 내뿜을때 사용합니다.

최소 하나 이상의 오류 발생 가능한 함수를 매개변수로 전달받아야 사용 가능합니다.

부모클래스의 rethrows메서드를 자식클래스의 throws메서드로 오버라이드는 불가능합니다.

부모클래스의 throws메서드를 자식클래스의 rethrows메서드로 오버라이드는 가능합니다.

프로토콜의 throw요구 함수를 rethrows를 사용하여 부합시키지 못합니다.

프로토콜의 rethrows요구 함수를 throw를 사용하여 부합시킬 수 있습니다.

 

    func authenticateUser(method: () throws -> Bool) rethrows {

        try method()

        print("Success!")

    }

 

 

 

 

defer

현재 코드 블록을 나가기 전에 꼭 실행되야 하는 코드가 실행되도록 보장을 해주는 것입니다.

함수, 메서드, 반복문, 조건문 등등 코드 블록 어디에서든 사용할 수 있습니다.

defer구문 내부에서는 break,  return, 등과 같이 빠져나가는 코드를 작성하면 안됩니다.

여러개의 defer 구문이 하나의 블록 내부에 속해 있다면 맨 마지막에 작성된 구문부터 역순으로 수행됩니다. 즉 

defer 구문은 현재 블록이 끝나기까지 실행을 미루고 있다가 끝나기 직전에 수행됩니다.

 

func printStringNumbers() {

  defer { print("1") }

  defer { print("2") }

  defer { print("3") }

  print("4")

}

/// Prints 4, 3, 2, 1

 

func writeFile() {

  let file: FileHandle? = FileHandle(forReadingAtPath: filepath)

  defer { file?.closeFile() }

  // Write changes to the file

 

  if ~~~ {

     return

  }

}

 

 

 

 

#swift 기초

#swift 강의

#ios programming

'IT > Swift' 카테고리의 다른 글

SwiftUI - UIHostingController  (0) 2019.10.16
SwiftUI 시작하기  (0) 2019.10.14
[swift] Binding, Tuple, Where  (0) 2019.10.06
[swift] Wildcard, Nested Types  (0) 2019.10.05
[swift] POP (Protocol Oriented Language)  (0) 2019.09.30