전체 글
-
-
swift - Error Handing #3 (defer Statement)swift 2021. 1. 13. 10:57
// defer // 코드의 실행을 스코프가 종료되는 시점으로 연기시킨다. // 보통 리소스 해제에 많이 사용한다. // defer문을 실행하면 statment가 바로 실행되지 않고 defer문이 호출된 스코프의 실행이 종료될때 까지 연기된다. func processFile(path: String) { let file = FileHandle(forReadingAtPath: path) print("1") // Process // runtime err가 발생하는 경우를 제외하고 이 함수가 종료되는 시점에 항상 호출된다. defer { print("2") file?.closeFile() } // 이렇게하면 .jpg일때 바로 종료되는데 자원이 해제가 안된다. if path.hasSuffix(".jpg") { p..
-
swift - Error Handing #3 (Optional Try)swift 2021. 1. 13. 10:49
// 두 표현식은 에러를 Optinal 값으로 변경한다 그래서 보통 Optional Binding과 함께 사용한다. enum DataParsingError: Error { case invalidType case invalidField case missingRequiredField(String) } func parsing(data: [String: Any]) throws { guard let _ = data["name"] else { throw DataParsingError.missingRequiredField("name") } guard let _ = data["age"] as? Int else { throw DataParsingError.invalidType } // Parsing } // 파싱 데이터..
-
swift - Error Handing #2 (do-catch Statement)swift 2021. 1. 13. 10:43
enum DataParsingError: Error { case invalidType case invalidField case missingRequiredField(String) } func parsing(data: [String: Any]) throws { guard let _ = data["name"] else { throw DataParsingError.missingRequiredField("name") } guard let _ = data["age"] as? Int else { throw DataParsingError.invalidType } // Parsing } func handleError() throws { // 구현하지 않은 에러가 발생하는 코드는 hanleErorr를 호출한 코드로 전달..
-
swift - Error Handing #1 (Error Handing)swift 2021. 1. 13. 10:34
Error Handing 에러가 발생하면 프로그램이 강제 종료되지만 에러를 직접 Handing하면 프로그램 종료 없이 처리 할 수 있다. 에러는 크게 Comile Time Error와 Runtime Error로 구분한다. Compile error는 보통 문법과 관련이 있다. runtime error는 프로그램이 실행중일때 발생, 문법적인 에러가 아니더라도 디바이스의 상태나 리소스 때문일 수도 있다. // err 프로토콜을 채용하면 err 형식이 되는데 보통 enum으로 선언한다. enum DataParsingError : Error { case invalidType case InvalidField case missingRequiredField(String) } // 일반 형식과 에러 형식의 차이점은 하나..
-
swift - Generic #3 (Associated Types)swift 2021. 1. 13. 10:22
// Generic protocol을 선언하는 방법 //protocol QueueCompatible { // func enqueue(value: Int) // func dequeue() -> Int? //} protocol QueueCompatible { associatedtype Element // : Equatable 연관형식을 제한할 수도 있음 func enqueue(value: Element) func dequeue() -> Element? } class IntergerQueue : QueueCompatible { // 연관 형식 설정 typealias Element = Int // 연관 형식을 Int로 했기 때문에 Int func enqueue(value: Int) { } func dequeue..
-
swift - Generic #2 (Generic Type)swift 2021. 1. 13. 10:16
Generic Type struct Color { var red: T var green: T var blue: T } let c = Color(red: 128, green: 80, blue: 200) // Color 형식이기 때문에 에러 // c = Color(red: 128.0, green: 80.0, blue: 200.0) let d: Color = Color(red: 128.0, green: 80.0, blue: 200.0) let arr: Array let dict : Dictionary extension Color where T == Int { func getComponents() -> [T] { return [red, green, blue] } } let intColor = Color(red:..
-
swift - Generic #1 (Function, Constraints)swift 2021. 1. 13. 10:06
// : Type Parameter func swapValue(lhs: inout T, rhs: inout T) { let tmp = lhs lhs = rhs rhs = tmp } a = 1 b = 2 swapValue(lhs: &a, rhs: &b) a b var c = 1.2 var d = 3.4 swapValue(lhs: &c, rhs: &d) c d // 제네릭 형식 제약 func swapValue(lhs: inout T, rhs: inout T) { // 파라미터로 비교 기능이 구현되지 않은 타입이 올 수 도 있기 때문에 직접 비교를 구현해주지 않으면 에러 발생 // T: Equatable -> Equatable 프로토콜을 채용한 자료형만 허락함 print("Genric version") if ..