본문 바로가기

Swift

(16)
[Swift] Enum 열거형 정복하기 2편 (Enum Case Pattern) 연관값(associated values)을 가진 열거형(enumeration)의 case를 매칭시킬 때 이 패턴을 사용합니다. switch 문, if 문, guard 문, for-in 문, while 문에서 모두 사용이 가능합니다. 기본적인 문법을 먼저 살펴보도록 하겠습니다. case Enum.case(let name): case Enum.case(var name): 각 케이스의 연관값은 상수나 변수로 바인딩이 가능합니다. case let Enum.case(name): case var Enum.case(name): 바인딩 방식이 동일하다면 let, var 키워드를 case 뒤에 바로 써줍니다. 대부분의 경우, 열거형의 형식은 추론이 가능하기 때문에 열거형 이름은 생략이 가능합니다. 열거형 이름을 생략하여..
[Swift] Enum 열거형 정복하기 1편 (Raw, Associated Values) 열거형(Enumeration)은 연관된 값들의 집합을 공통된 타입으로 정의하는 것입니다. 열거형은 type-safe 하게 코딩할 수 있는 방법이죠. 주로 요일과 같이 한정된 경우의 수를 정의할 때 사용합니다. 기본적인 문법은 아래와 같습니다. enum Name { case firstCase case secondCase } 열거형의 이름은 주로 단수형을 사용합니다. C나 Objective-C와는 다르게 각 case 에 기본적인 정수값(0, 1, 2 ...)이 할당되지는 않습니다. Raw Values 열거형의 case 는 모두 독립적인 값이지만 내부에 또 다른 값을 저장할 수 있습니다. 이것을 원시값(raw value)이라고 합니다. 열거형을 정의할 때 원시값 저장은 필수사항이 아닙니다. 직접 만든 열거형에..
[Swift] Type Casting (is, as, as?, as!) 타입캐스팅 완벽 정리 타입 캐스팅(Type Casting) 은 인스턴스의 타입을 확인하거나, 해당 인스턴스를 자신의 클래스 계층에 있는 상위 혹은 하위 클래스로 처리하는 방법입니다. 스위프트의 타입 캐스팅은 is 와 as 연산자로 구현됩니다. 이 두 연산자는 값의 타입을 확인하거나 값을 다른 타입으로 지정합니다. 단순하면서도 보고 이해하기 쉬운 표현 방식이죠. 또한, 타입 캐스팅을 사용하여 해당 타입이 프로토콜을 따르는지(Protocol Conformance)도 확인할 수 있습니다. 타입 캐스팅 연산자 타입 캐스팅 연산자는 총 4가지가 있습니다. expression is type expression as type expression as? type expression as! type is 연산자는 런타임에 expression..
[Swift] Escaping Closure 탈출 하는 클로저!? 클로저(Closure)가 함수의 인자로 전달되고 함수 외부에서 실행될 때 함수를 탈출(escape)하는 클로저라고 합니다. 이 클로저는 함수가 반환된 후에 호출됩니다. 함수의 매개변수 타입 앞에 @escaping을 작성하여 해당 클로저가 함수를 탈출할 수 있음을 나타냅니다. 클로저가 함수를 탈출할 수 있는 방법은 함수 외부에 정의된 변수에 저장되는 것입니다. 예를 들어, 비동기 작업을 해야하는 많은 함수들은 completion handler 매개변수로 클로저를 받습니다. 해당 클로저는 함수의 작업이 완료될 때 까지 호출되지 않습니다. 즉, completion handler 는 함수의 작업이 완료된 후 호출되는 것을 보장받을 수 있습니다. var completionHandlers: [() -> Void] ..
[Swift] Capturing Values 값을 캡쳐한다는 것 Swift에서 값을 캡쳐(Capture)한다는 것의 의미를 한 번 알아보겠습니다. 클로저(Closure)는 정의된 주변의 컨텍스트에 있는 상수나 변수들을 캡처할 수 있습니다. 그런 다음 클로저는 상수와 변수를 정의한 원래 범위가 더 이상 존재하지 않더라도 그 상수와 변수의 값을 참조하고 수정할 수 있습니다. 스위프트에서 값을 캡처할 수 있는 클로저의 가장 간단한 형태는 중첩 함수(Nested Function)로서, 다른 함수의 body 안에 정의되어 있습니다. 중첩 함수는 외부 함수의 인수를 캡처할 수 있으며, 또한 외부 함수 내에 정의된 상수와 변수를 캡처할 수 있습니다. incrementer 중첩 함수를 포함한 makeIncrementer 함수 예제를 살펴보겠습니다. incrementer 함수는 ru..
[Swift] Closure? 함수 블록 클로저에 대해 알아보자 클로져(Closure)란 코드에서 전달되고 사용될 수 있는 자체적인(self-contained) 함수 블록입니다. 스위프트에서의 클로저는 C와 Objective-C에서의 블록과 유사하고 다른 프로그래밍 언어에서는 람다와 유사합니다. 클로저는 클로저가 선언된 컨텍스트에 있는 모든 상수나 변수들의 참조값을 저장하고 캡처할 수 있습니다. 이것은 상수나 변수들을 closing over 한다고 표현하기도 합니다. 스위프트는 캡처에 대한 모든 메모리 관리를 다룹니다. 값을 캡처하는 것(Capturing Values)에 대한 개념은 다음 포스팅에서 자세히 다루도록 하겠습니다. 흔히 알고있는 글로벌 함수, 중첩 함수(함수 내부에 선언된 함수) 들은 실제로는 클로저의 특별한 케이스 입니다. 클로저는 다음 3가지 중 하나..
[Swift] Optional 제대로 알기 C나 Objective C에는 없는 개념인 Optional에 대해 알아보도록 하겠습니다. Optional은 Generic Enumeration으로 선언되어 있으며, wrapped value나 nil을 나타내는 타입입니다. Optional은 해당 변수에 값이 없을 것(nil) 같을 때 사용할 수 있습니다. let possibleNumber = "123" let convertedNumber = Int(possibleNumber) // convertedNumber는 Int?나 Optional로 형식이 추론됩니다. String인 "123"을 Int로 캐스팅하면 당연히 123이 나오겠다고 생각하지만 캐스팅은 실패할 수도 있습니다. 그렇기 때문에 캐스팅 결과는 Optional 타입으로 반환되게 됩니다. Option..
[Swift] Result Type으로 명확한 결과값 만들기 Swift 5에 새롭게 추가된 에러 처리 방식으로 Result Type에 대해 알아보도록 하겠습니다. 먼저 그 동안 에러 처리를 어떻게 해오고 있었는지 살펴보겠습니다. Swift 1 시절 Objective C와 동일한 방식으로 에러를 처리하였습니다. var error: NSError? let str: NSString let url: URL let success = str.writeToURL(url, atomically: true, encoding: NSUTF8StringEncoding, error: &error) if !success { println("Error: \(error!)") } 포인터 형식으로 NSError를 사용하였기에 포인터 사용을 지양하는 스위프트에는 어울리지 않았습니다. Swift 2..