본문 바로가기

Swift

(21)
[Swift] Computed Property 는 언제 쓰는지 알아보자 Computed Property를 직역하면 계산된 속성이 됩니다. 하지만 수학적 계산이 실행된다는 의미는 아닙니다. 다른 속성을 기반으로 해당 속성 값이 결정된다는 의미입니다. 저장 속성(Stored Property)은 값을 저장할 메모리 공간을 가지고 있습니다. 반면에, 연산 프로퍼티(Computed Property)는 메모리 공간을 가지지 않습니다. 다른 속성에 저장된 값을 읽어서 필요한 계산을 실행한 다음 반환(return)하는 것입니다. 또한 연산 프로퍼티에 값을 할당하는 것은 속성으로 전달된 값을 다른 속성에 저장하는 것입니다. 이런 특징 때문에 속성에 접근할 때마다 다른 값이 반환될 수 있습니다. 그러므로 연산 프로퍼티는 let이 아닌 var로 선언해야합니다. 저장 속성은 클래스, 구조체에만 ..
[Swift] lazy var ? Lazy Stored Property 에 대하여 지연 저장 속성 (Lazy Stored Property) 은 인스턴스가 초기화 되는 시점이 아니라 속성에 처음 접근하는 시점에 초기화됩니다. lazy 키워드를 사용하여 선언하는 방법은 아래와 같습니다. lazy var name: Type = DefaultValue 초기화 시점이 지연되기 때문에 몇 가지 제한이 있습니다. 인스턴스가 초기화된 이후에 지연 저장 속성은 개별적으로 초기화가 됩니다. 그렇기 때문에 변수(lazy var)가 아닌 상수(lazy let)로 선언은 불가능 합니다. 또한 생성자에서 초기화 하지 않기 때문에 선언 시점에 기본값을 저장해주어야 합니다. 이미지를 저장하는 구조체 예제를 살펴보겠습니다. struct Image { init() { print("New Image") } } 예제이므..
[Swift] Namespace 네임스페이스 란? (Struct, Enum 활용) 다른 라이브러리, 프레임워크와 이름이 충돌되지 않기 위해 Objective-C 클래스에는 고유한 이름이 있습니다. 애플이 UIView, CGRect, CALayer 와 같이 Objective-C 클래스에 접두어를 사용하는 이유입니다. 하지만 스위프트 모듈은 클래스 접두사가 필요하지 않습니다. 스위프트는 현재 모듈 내의 네임스페이스(Namespace) 유형과 상수에 대한 솔루션을 제공하지 않고 있습니다. 스위프트로 작업할 때 일반적인 문제는 프로젝트를 함께 진행하는 개발자 누구나 쉽게 이해하는 방식으로 상수를 정의하는 것입니다. Objective-C 에도 유사한 고민이 있습니다. 모든 상수에는 이름 충돌을 피하기 위해 두 개 또는 세 개의 글자가 앞에 붙고 용도를 설명합니다. NSString * const..
[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)이라고 합니다. 열거형을 정의할 때 원시값 저장은 필수사항이 아닙니다. 직접 만든 열거형에..
[iOS] 강한 참조 사이클 (순환 참조) 해결하기 2편 두 인스턴스가 서로를 참조할 경우 강한 참조 사이클이 발생하고 인스턴스가 메모리에서 정상적으로 해제되지 않는 것을 강한 참조 사이클 해결하기 1탄에서 확인하였습니다. 강한 참조 사이클(Strong Reference Cycle)이 발생하는 문제를 해결하기 위해 약한(weak) 참조와 비소유(unowned) 참조로 해결하였죠. 클로저(Closure)에서도 강한 참조 사이클이 발생할 수 있습니다. 클로저가 인스턴스를 캡처하고 인스턴스가 클로저를 강한 참조로 저장하고 있다면 인스턴스는 메모리에서 정상적으로 해제되지 않습니다. 이 경우에도 약한 참조나 비소유 참조를 통해 해결할 수 있습니다. 강한 참조 사이클이 발생하는 경우를 예시를 통해 살펴보겠습니다. class Car { var totalDrivingDist..
[iOS] 강한 참조 사이클 (순환 참조) 해결하기 1편 인스턴스를 사용하지 않는데도 메모리에서 해제 되지 않으면 메모리 누수(Memory Leak)가 발생합니다. 강한 참조 사이클(Strong Reference Cycle)에 의해 발생할 수 있으며 약한(Weak) 참조와 비소유(Unowned) 참조를 통해 해결할 수 있습니다. 강한 참조에 대한 자세한 설명은 ARC 란? 을 참고해주세요! 강한 참조 사이클은 순환 참조(Retain Cycle)라고도 불립니다. 예시를 통해 강한 참조 사이클이 발생하는 경우를 먼저 살펴보도록 하겠습니다. class Person { var name = "John" var apartment: Apartment? deinit { print("Person deinit") } } class Apartment { var address: S..
[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] Capturing Values 값을 캡쳐한다는 것 Swift에서 값을 캡쳐(Capture)한다는 것의 의미를 한 번 알아보겠습니다. 클로저(Closure)는 정의된 주변의 컨텍스트에 있는 상수나 변수들을 캡처할 수 있습니다. 그런 다음 클로저는 상수와 변수를 정의한 원래 범위가 더 이상 존재하지 않더라도 그 상수와 변수의 값을 참조하고 수정할 수 있습니다. 스위프트에서 값을 캡처할 수 있는 클로저의 가장 간단한 형태는 중첩 함수(Nested Function)로서, 다른 함수의 body 안에 정의되어 있습니다. 중첩 함수는 외부 함수의 인수를 캡처할 수 있으며, 또한 외부 함수 내에 정의된 상수와 변수를 캡처할 수 있습니다. incrementer 중첩 함수를 포함한 makeIncrementer 함수 예제를 살펴보겠습니다. incrementer 함수는 ru..