728x90

Swift 41

KeyValuePairs

안녕하세요. 이번엔 Swift의 Collection 중 하나인 KeyValuePairs에 대해 알아보려고 해요. # KeyValuePairs KeyValuePairs는 순서가 있는 key-value 쌍을 저장하는 collection 입니다. 순서가 있기 때문에 Dictionary보다 value를 찾는 속도가 느립니다. 또한 순서가 있기 때문에 Dictinary와는 다르게 element가 Hashable 프로토콜을 준수할 필요가 없습니다. 그리고 같은 키를 중복해서 저장할 수 있어요. KeyValuePairs는 ExpressibleByDictionaryLiteral 프로토콜을 준수하기 때문에, dictionary literal을 사용해서 KeyValuePairs 인스턴스를 만들 수 있습니다. 특정 key..

Swift 2024.01.28

Memory Safety

오늘은 메모리 충돌 관련한 Swift 공식 문서를 읽어보고 내용 정리해 보는 시간을 가져볼게요. # 개요 Swift는 동일한 영역에 있는 메모리에 대해서 여러 액세스가 충돌하지 않도록 하기 위해 메모리 위치를 수정(=write)하는 코드가 해당 메모리에 대해 독점적인 액세스 권한을 갖는 것을 보장합니다. 즉, 메모리에 write 액세스를 해야 하는 경우 read든 write든 다른 액세스가 올 수 없다는 거죠. 만약 충돌이 발생하면 컴파일 타임 에러 또는 런타임 에러가 발생해요. 언제 충돌이 발생할 수 있는지를 알면 충돌이 발생하지 않는 코드를 작성할 수 있겠죠??ㅎㅎ 알아봅시다. [참고] 앞으로 설명드리는 얘기는 단일 스레드 환경입니다. 단일 스레드에서 메모리에 대해 액세스가 충돌한다면, Swift에서..

Swift 2024.01.25

클래스(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