728x90

Swift 48

클래스(class type) 생성자에 대해 알아보자

안녕하세요. 이전에 구조체 생성자에 대해 알아봤어요. 오늘은 클래스 생성자를 공부할게요ㅎ # 1. Designated initializer, Convenience initializer Designated initializer는 해당 클래스의 모든 property(부모 클래스가 가지고 있는 property 포함)를 초기화하는 생성자입니다. Convenience initializer는 designated initializer와 유사하지만 생성자 내부에서 designated initializer를 호출할 수 있어요. 클래스는 1개 이상의 designated initializer를 가져야 하며, convenience initializer는 있어도 되고 없어도 됩니다. # 2. Initializer Delegat..

Swift 2024.01.21

구조체(value type) 생성자에 대해 알아보자

안녕하세요. 갑자기 Swift 언어 공식 문서에 꽂혀서... 기초를 다질 겸 틈틈이 보고 있습니다ㅎㅎ 오늘은 구조체 생성자에 대한 내용 간단하게 정리해볼게요. # 1. Initializer Delegation 생성자(initializer)는 인스턴스 초기화를 하기 위해 다른 생성자를 호출할 수 있고 이런 과정을 'Initializer Delegation'이라고 부릅니다. # 2. 구조체에서 self.init는 생성자에서만 호출할 수 있습니다. 구조체 안에서 생성자 외에 다른 곳(함수 등)에선 self.init을 호출할 수 없어요. # 3. 커스텀 생성자를 만든 경우 default 생성자를 사용할 수 없습니다. # 4. extension 안에 커스텀 생성자를 넣은 경우 default 생성자를 쓸 수 있습니..

Swift 2024.01.17

private(set)

안녕하세요. Swift에서는 상수, 변수, property, subscripts의 getter와 setter의 access level이 property의 해당 상수, 변수, property, subscripts의 access level과 동일하게 설정됩니다. (예를 들어 property가 private이면 getter와 setter도 private인 거죠) 뿐만 아니라, Swift에서는 setter의 access level을 getter 보다 더 낮게 설정할 수도 있어요. 이를 위해 var 또는 subscript 키워드 앞에 fileprivate(set) 또는 private(set) 또는 internal(set)을 작성함으로써 setter의 access level을 낮출 수 있습니다. 예시 몇 개만 보..

Swift 2024.01.17

@available

안녕하세요. 이번엔 Swift의 @available 속성에 대해서 알아볼게요. available 속성을 사용하면 특정 Swift 버전이나 특정 플랫폼 및 os 버전과 관련된 선언 lifecycle을 나타낼 수 있어요. ## Arguments available은 2개 이상의 인자가 필요해요. 인자는 다음 중 하나의 플랫폼 또는 언어 이름으로 시작합니다. - iOS - iOSApplicationExtension - macOS - macOSApplicationExtension - macCatalyst - macCatalystApplicationExtension - watchOS - watchOSApplicationExtension - tvOS - tvOSApplicationExtension - visionOS..

Swift 2023.12.05

@testable

안녕하세요. 프로젝트 만들 때 Unit Test 추가하려고 'Include Tests' 체크박스 체크한 적 있으시죠? 그럼 아래처럼 Test 파일이 생성될 건데, 하나 특이한 점은 import 앞에 @testable 이란 것이 붙었어요. 이번엔 @testable이 뭔지에 대해서 간단하게 알아볼게요. # @testable 이란? Swift Access Control에 의해 internal 레벨 이하로 설정되어 있으면 앱이나 프레임워크 외부에서 접근이 어렵습니다. (open이 가장 높고 private이 가장 낮아요!) 즉, 테스트 코드에서 internal 레벨 코드를 테스트하려면 internal 레벨을 public 이상으로 올려줘야 할 텐데 이건 말이 안 되겠죠?? 이때 import 앞에 @testable ..

Swift 2023.11.21

Dictionary Enum.rawValue subscript

안녕하세요. 예전에 subscript에 대해서 알아봤는데요. [참고] subscript 란? subscript를 모르시면 여기를 먼저 보고 와주세요! Enum의 rawValue를 key로 해서 Dictionary를 읽고 쓰는 방법에 대해 추가로 알아볼게요. 아래와 같은 Dictionary가 있고, Dictionary의 key(필드)를 모아둔 Profile이란 enum 타입이 있다고 해볼게요. 공부한 것을 토대로 subscript를 추가하면 'Cannot convert value of type 'String' to expected argument type 'Profile' 이란 컴파일 에러가 발생합니다ㅠ 이 경우, enum의 rawValue를 Key 타입으로 캐스팅해서 사용해야 합니다!! [참고] Key?..

Swift 2023.08.08

Opaque and Boxed Types

안녕하세요. 이번엔 Swift의 opaque types와 boxed protocol types 관련 Document를 읽고 정리해 보는 시간을 가져볼게요. (Document에 있는 예제를 활용해서 정리해 볼게요.) Shape이란 protocol을 정의하고, Shape protocol을 준수하는 Triangle이란 구조체가 있다고 해볼게요. 여기까진 ㅇㅋ. 제네릭을 사용해서 FlippedShape란 구조체도 만들어봤어요. 이것도 ㅇㅋ... 라고 넘길 수도 있지만! flippedTriangle 상수를 잘 살펴보면 제네릭의 구체적인 타입까지 같이 노출되고 있죠? 만약 제네릭 타입을 2개 받는 구조라면, 2개의 구체적인 타입까지 같이 노출되게 됩니다. 사실 사용자 입장에선 제네릭 타입이 어떤 타입인지 알 필요..

Swift 2023.07.01

Thread.sleep vs Task.sleep

안녕하세요. 이번엔 Thread.sleep과 Task.sleep의 차이점에 대해 알아보려고 합니다. # 주요 차이점 Thread.sleep Task.sleep iOS 2.0 이상 iOS 13.0 이상 구 API 신 API cancel 불가능 Task cancel 가능 주어진 시간 만큼 Thread 멈춤 현재 Task를 중지하고, 주어진 시간 동안 다른 Task 수행 (Thread를 멈추는 것이 아님) # 예시 1초 sleep을 100번 수행했을 때 Thread.sleep과 Task.sleep이 어떻게 다르게 동작하는지 살펴볼게요. 가장 이상적인 동작은 1초만 sleep 하는 것이겠죠? (100개의 Task(or Thread)에서 동시에 1초를 sleep 하면, 실제 시간으로 1초만 sleep 한 거랑 동..

Swift 2023.06.01

[Swift 5.8] weak self 사용 시 self 생략 가능해짐

안녕하세요. Swift 5.8부터 클로저에서 [weak self] capture를 사용할 때 self가 unwrapped 되었으면 self를 생략할 수 있다는 것 알고 계셨나요?? (전 몰랐습니다..) 알아볼게요ㅎㅎ 이전 Swift 5.3에서도 클로저 안에서 self를 생략할 수는 있었어요. (SE-0269) 다만, 이때는 [self]로 capture 했을 때만 self를 생략할 수 있었고 [weak self]는 지원하지 않았습니다. Swift 5.8부터는 클로저 내부에서 [weak self]를 선언했다면, guard-let, if-let 등 self를 unwrapping 한 이후부터는 self를 생략할 수 있게 되었습니다. 단, nested 클로저의 경우 retain cycle 위험이 있기 때문에 se..

Swift 2023.05.15

KeychainAccess Array 저장 API 추가하기

안녕하세요. KeychainAccess는 키체인에 쉽게 쓰고 읽는 기능을 제공하는 Wrapper 모듈입니다. KeychainAccess는 키체인에 문자열 또는 Data read/write 기능을 제공해주고 있기 때문에 매우 편리합니다. 근데, Array에 대한 read/write 관련 기능은 안보이더라구요...;; 그래서 문자열 배열을 키체인에 쉽게 read/write 할 수 있는 간단하게 만들어봤습니다. # extension # 사용법 subscript를 사용할 수도 있고 method로 사용할 수도 있습니다. (subscript가 궁금하신 분들은 아래 글을 봐주세요!) subscript 안녕하세요. 이번에는 Swift의 subscript에 대해 알아볼게요. 클래서, 구조체, 열거형에서 subscript..

Swift 2023.04.20