728x90

Swift 48

Designated initializer cannot be declared in an extension

안녕하세요. Swift를 사용해 보셨다면, 이런 에러를 몇 번 보셨을 거예요.  Designated initializer cannot be declared in an extension of 'SomeClass'; did you mean this to be a convenience initializer?  그 이유는 Swift가 extension에서 designated initializer를 구현하는 것을 허용하지 않기 때문입니다.그 이유를 알아볼게요.Swift가 extension에서 designated initializer 구현하는 것을 허용한다고 가정해 볼게요. 아래 코드가 허용되겠죠.  Person 클래스를 상속받은 Korean 클래스가 있어도 크게 문제 될 건 없죠.(Person 클래스의 desi..

Swift 2024.12.29

map, compactMap, flatMap

안녕하세요. 주로 Objective-C를 쓰다 보니... Swift의 compactMap과 flatMap이 자꾸 헷갈리더라구요.. 글로 남겨두면 안 까먹겠지 싶어 map 삼총사 공부하고 정리해 보려고요ㅎㅎ # mapSequence의 elements들을 변환시킨 결과의 배열을 반환하는 함수. 시간복잡도는 O(n)입니다. # compactMapSequence의 elements들을 변환시키고 nil이 아닌(=Optional이 아닌) 결과의 배열을 반환하는 함수.(map 결괏값이랑 비교하면 어떤 차이인지 알겠죠?) 시간복잡도는 O(n)입니다. # flatMapSequence의 elements들을 변환시키기고 single-level collection을 반환하는 함수. 여기서 single-level collect..

Swift 2024.08.18

lazy var 클로저에서 retain cycle이 생기는 경우

# 1. 클로저가 바로 실행되는 경우 -> retain cycle 없음.lazy var 클로저가 곧바로 실행되는 경우, 컴파일러에 의해 클로저는 @nonescape 처리가 되어 self를 캡처하지 않는다. 즉, retain cycle이 발생하지 않는다. 예를 들어, 아래처럼 lazy var의 클로저가 곧바로 실행된다면 retain cycle이 증가하지 않고,. 변수에 nil이 설정되면 deinit이 호출된다.  # 2. 클로저 자체를 lazy var로 정의한 경우 -> retain cycle 발생할 수 있음.클로저는 reference type이다. 클로저 자체를 lazy var로 정의하면, lazy var를 사용하는 곳에서 클로저 인스턴스를 lazy 하게 생성된다. 생성된 후 클로저 내부가 실행되므로 클..

Swift 2024.06.20

@propertywrapper

안녕하세요. 대충은 알지만 대충 알고 있던 @propertywrapper에 대해서 알아볼게요. # @propertywrapper란?propertywrapper는 프로퍼티가 저장되는 방식을 관리하는 코드와 프로퍼티를 정의하는 코드를 분리하는 역할을 합니다. 예를 들어, 프로퍼티에 값을 저장하기 전에 thread-safety 검사를 해야 하는 상황이 있다고 가정해 볼게요. 이 경우, 모든 프로퍼티에 대해 thread-safety 검사를 하는 코드를 작성해야 합니다. 하지만, propertywrapper를 사용하면 관리 코드를 포함한 propertywrapper를 정의해 두고, 여러 프로퍼티에 해당 propertywrapper를 적용하여 관리 코드를 재사용할 수 있어요. # propertywrapper 정의 ..

Swift 2024.06.07

protocol initializer가 클래스에서 required로 정의되어야 하는 이유

안녕하세요. initializer를 protocol에 정의한 경우, protocol을 채택한 클래스는 protocol에 정의된 initializer를 required로 정의해야 합니다. 인터넷에 이유를 찾아보니까 클래스의 서브클래스에서도 initializer를 강제로 구현하도록 하기 위해서라고 하는데 전 이해가 잘 안 가더라고요.. 저처럼 이해 못 하신 분들의 이해를 돕기 위해 예시를 하나 가져와봤습니다. # 예시우선 protocol의 initializer를 required로 정의하지 않아도 된다고 가정해 볼게요. initializer가 정의된 Animal이란 protocol이 있고,  Animal protocol을 준수하는 Mammal 클래스가 있다고 해볼게요.  Animal protocol을 채택한 ..

Swift 2024.05.12

propertyWrapper로 UserDefaults 관리

안녕하세요. propertyWrapper를 사용하면 UserDefaults 데이터 읽기/쓰기를 쉽게 하는 방법이 있어서 공유드리려구 해요. 프로젝트에 UserDefaultsWrapper라는 propertyWrapper를 추가해주세요. (당연히 이름은 마음대로 하셔도 됩니다.)  그 다음 UserDefaultsManager 라는 구조체를 만들고 UserDefaultsWrapper로 선언된 프로퍼티를 추가합니다.  UserDefaults에서 값을 읽거나 써야 할 땐 그냥 UserDefaultsManager의 stored property를 사용하면 됩니다.(당연히 primitive type 뿐만 아니라 구조체도 가능해요!)  이번 글은 여기서 마무리.

Swift 2024.05.11

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