본문 바로가기

Swift

(21)
[Swift] Closure? 함수 블록 클로저에 대해 알아보자 클로져(Closure)란 코드에서 전달되고 사용될 수 있는 자체적인(self-contained) 함수 블록입니다. 스위프트에서의 클로저는 C와 Objective-C에서의 블록과 유사하고 다른 프로그래밍 언어에서는 람다와 유사합니다. 클로저는 클로저가 선언된 컨텍스트에 있는 모든 상수나 변수들의 참조값을 저장하고 캡처할 수 있습니다. 이것은 상수나 변수들을 closing over 한다고 표현하기도 합니다. 스위프트는 캡처에 대한 모든 메모리 관리를 다룹니다. 값을 캡처하는 것(Capturing Values)에 대한 개념은 다음 포스팅에서 자세히 다루도록 하겠습니다. 흔히 알고있는 글로벌 함수, 중첩 함수(함수 내부에 선언된 함수) 들은 실제로는 클로저의 특별한 케이스 입니다. 클로저는 다음 3가지 중 하나..
[iOS] GCD 활용하기 2편 (DispatchGroup, DispatchSemaphore) 동시에 실행되는 작업들을 관리하는 방법에 대해서 알아보겠습니다. 여러 작업을 하나의 그룹으로 관리하고 하나의 리소스에 대한 접근을 통제해야 하는 문제들을 GCD를 활용하여 해결해보겠습니다. DispatchGroup DispatchGroup 은 디스패치 큐에 추가된 작업을 가상의 그룹으로 관리합니다. 서로 다른 디스패치 큐에 추가된 작업을 동일한 그룹에 추가하는 것도 가능합니다. 여러 작업을 하나의 작업으로 묶는 것이라고 생각하면 편합니다. 그러므로 그룹에 포함된 모든 작업이 완료되어야 그룹이 완료됩니다. 예시를 통하여 그룹이 어떻게 사용되는지 알아보겠습니다. let queue1 = DispatchQueue(label: "ConcurrentQueue", attributes: .concurrent) let ..
[iOS] GCD 활용하기 1편 (DispatchQueue) 이전 포스팅에서 GCD의 기본 개념을 살펴보았다면 이제 예제 코드를 통해서 활용하는 법을 알아보도록 하겠습니다. GCD는 iOS의 Concurrency 프로그래밍의 근간을 이루는 기술입니다. Dispatch Queue는 자동으로 스레드를 생성하고 효율적으로 관리합니다. Thread pool을 통해서 Thread를 재사용하기 때문에 시스템 리소스를 적게 사용하고 성능 또한 빨라집니다. GCD는 직관적이고 단순한 API를 제공합니다. 모든 Apple 플랫폼(iOS, macOS, watchOS, tvOS)에서 동일한 API를 활용 가능하다는 것도 큰 장점입니다. GCD의 핵심 객체는 Dispatch Queue입니다. Dispatch Queue에 Block 형태로 추가하거나 WorkItem으로 캡슐화해서 추가하..
[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..