본문 바로가기

Swift

(16)
[Swift] Metatype 이란? (.Type, .self, .Protocol) (번역) 이번 포스팅에서는 Metatype에 대해 정확히 알아보고자 합니다. 실제로 자주 사용해왔지만 이것이 무엇이냐 묻는다면 정확히 답변하기는 어려웠을 것입니다. 각 접미사들의 차이는 정확히 무엇인지 알아보겠습니다. Metatype 이란? 애플 문서를 살펴보면 Metatype은 타입의 타입이라고 정의되어 있습니다. String 타입의 타입? 이미 타입인데 이 타입의 타입이 있다는 것이라고 합니다. 이론적으로는 이상하게 들리지만 Swift의 쉬운 사용성을 위해 이러한 세세한 사항들을 숨기는 Swift 문법에 익숙해 졌기 때문일 수 있습니다. struct Device { static let name = "iPhone" func turnOn(name: String) {} } let myPhone: Device = D..
[Swift] defer의 동작 원리는 무엇일까? (번역) Swift2에 도입된 defer는 실제로 많이 사용되진 않습니다. 그래서 보통 defer가 어떻게 동작하고 있는지 궁금해하지 않습니다. defer는 현재 scope에서 제일 끝에서 실행되어야하는 코드를 포함하는 클로저와 함께 사용되는 연산자입니다. 함수에 return문이 많고 각 return문 앞에 동일한 코드를 복사하여 붙여 넣어야 하는 경우 유용하게 사용됩니다. 또는 스레드로부터 안전한 동작을 구현하기 위해 로직을 실행하기 전에 NSLock 객체를 lock() 하였다면, defer { lock.unlock() } 을 함께 넣으면 교착 상태에 빠지거나 메모리 누수가 발생하는 걸 방지할 수 있습니다. 함수의 끝에서 실행된다는 것은 알고 있지만 정확히 어떻게 동작되는 것인지 자세히 살펴보도록 하겠습니다. ..
[SwiftUI] 버튼 스타일 (ButtonStyle) 만들어 쉽게 재사용하기 앱 하나에 사용하는 버튼 스타일은 보통 규격화되어 있습니다. 따라서 버튼을 추가할 때마다 해당하는 스타일 값을 일일이 세팅하게되면 매우 수고스러운 일일 것입니다. UIKit을 사용하고 있다면 UIButton 클래스를 상속받아 커스텀 클래스를 활용하여 이 문제를 해결하였을 것입니다. SwiftUI에서는 ButtonStyle 프로토콜을 채용한 구조체를 만들어 쉽게 버튼 스타일을 재사용할 수 있습니다. ButtonStyle을 적용하지 않은 Button Button(action: viewModel.refresh) { Text(viewModel.refreshButtonTitle) } .frame(width: 230, height: 45) .font(.system(size: 14)) .foregroundColor(..
[SwiftUI] AutoLayout의 Center Y 처럼 비율 위치를 구현하는 방법 UI를 구현할 때, 오토레이아웃(AutoLayout) 방식으로 디자인 가이드를 구현해왔다면 SwiftUI를 처음 맞닥뜨리게되면 조금 당황스러울 수 있습니다. UI 그리는 개념이 완전히 다르기 때문입니다. 뭔가 안드로이드에서 UI를 그리는 방식과 닮은 느낌이 납니다. 오늘은 제가 받은 디자인 가이드에서 조금 난해했던 부분을 공유하고자 합니다. 디자인 가이드 예시는 다음과 같습니다. 초록색 원의 Y 위치가 고정값(pt)이 아닌 비율(%)로 나타내어져 있습니다. AutoLayout을 사용했다면 아래 처럼 간단하게 해결했을 것입니다. 하지만 SwiftUI 에서는 이런 방식이 불가능 합니다. 어떻게 하면 그나마 간단하게 구현할 수 있을지 고민 하였습니다. 해결 방법은 GeometryReader, VStack, S..
[SwiftUI] Property wrappers for data flow SwiftUI 는 애플리케이션에서 일어나는 데이터 흐름을 관리하는 몇 가지 도구들을 제공합니다. Swift 5.1 에 추가된 Property wrapper는 변수의 기능을 한 단계 업그레이드 시켜줍니다. SwiftUI 에도 특정한 wrapper가 있습니다. 바로 @State, @Binding, @ObservedObject, @EnvironmentObject 입니다. 이 wrapper들은 변수에 의해 표현된 데이터에 대한 View의 의존성을 선언하는 역할을 합니다. 설명이 너무 어렵나요? 그럼 하나씩 살펴보도록 하겠습니다. 😎 @State @State 로 지정된 변수들은 View가 해당 변수들을 소유(own)합니다. 일시적인 것이 아닌 View가 메모리에 살아있는 한, 해당 변수는 메모리에 할당되어 있음을..
[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..