Swift 127

[Swift] CustomStringConvertible - 구조체, 클래스 출력하기

CustomStringConvertible 소개 Swift에서 구조체나 클래스를 출력하면 저희가 원하는대로 나오지 않는 경험 다들 한 번씩은 해보셨을 겁니다. 예를 들어, class Point { var x: Int var y: Int init(x: Int, y: Int) { self.x = x self.y = y } } 이런 Point 클래스가 있을 때 이 객체를 출력할 때 x와 y 값을 확인하고 싶다고 합시다. let point = Point(x: 1, y: 2) print(point) //__lldb_expr_15.Point 그래서 point 객체를 출력하면 x, y가 아니라 객체 정보가 출력이 돼요. 클래스를 구조체로 바꾸면 클래스보다는 낫지만 우리가 흔히 사용하는 (x, y) 형태가 아니라 구조..

[Swift] "public typealias AnyObject" (짧)

AnyObject AnyObject가 프로토콜이라는 것은 많은 분들이 아실 거에요. 근데 공식문서를 보니 AnyObject가 Protocol이 아니라 Type Alias라고 적혀있는거에요? 원래 프로토콜은 이렇게 Protocol이라고 적혀있잖아요..?? 근데 AnyObject는 왜 Type Alias라고 적혀있을까? 라는 생각이 들었습니다. (1차 혼란) 그래서 AnyObject를 타고 들어가서 보니 typealias로 적혀있더라고요. 근데 좀 어색하지 않나요? 원래 typealias는 OOO = 타입으로 옆에 어떤 타입인지 적혀 있어야 합니다. 근데 AnyObject에는 아무것도 없는거에요... (2차 혼란) 이에 대해 검색해보니 이미 누가 스택오버플로우에 올렸더라고요. 알고보니 원래 코드에는 정상적으..

[Swift] String.Index 활용법

서론 저는 String을 다룰 때 편의를 위해 [Character] 타입으로 변환하면서 사용해 왔습니다. 이러면 subscript를 이용해 원소에 접근할 수 있지만 배열로 변환하는 시간이 추가로 필요합니다. 그래서 String.Index를 잘 다뤄보고자 포스팅을 작성하기로 했습니다. 이번 포스팅은 String.Index가 무엇인지보다 여러 상황에서 어떻게 사용하는지를 다룹니다. 아래에서 꾸준히 나오는 string 변수는 "abcdefg" 입니다. String.Index 이 주제는 이미 지난 포스팅에서 다룬 적이 있습니다. [Swift] Unicode Scalar와 String의 Random Access 서론 오늘 iOS Developers KR 카톡방에서 재밌는 사실을 알았습니다. (사실 공식 문서에 나..

[Swift] 왜 ContiguousArray는 Array보다 자주 사용되지 않을까?

서론 (아마 ContiguousArray에 대한 마지막 글) ContiguousArray는 Array보다 효율적입니다. 이는 공식 문서에도 나온 내용이고, 저도 관련해서 포스팅을 썼었죠. (https://jeong9216.tistory.com/468) 하지만 실제 코드를 보면 Array가 훨씬 더 자주 보입니다. 문득 궁금했습니다. ContiguousArray가 더 효율적이면 Array보다 더 자주 사용되어야 하는게 아닌가? 물론, ContiguousArray는 Array보다 덜 대중적이긴 합니다만, Array가 너무 압도적으로 사용이 된단 말이죠? 그래서 혹시 다른 이유는 없는지 찾아보았습니다. 참고로 이번 글은 저의 추측 내용도 많기 때문에 참고만 해주시면 감사하겠습니다. 혹시 틀린 내용이 있다면 댓..

[Swift] NSCache(feat. Dictionary)

서론 이미지 캐싱을 구현하다가 NSCache와 Dictionary의 차이점이 궁금해서 찾아보았습니다. 이미 많은 블로그에서 다룬 주제이지만 직접 실험도 해보면서 제 지식으로 만들기 위해 포스팅 해봅니다. 중간 중간 주관적인 의견도 섞여 있으니 틀렸거나 반대 의견이 있으시다면 댓글로 알려주세요. NSCache NSCache는 key-value 형태의 데이터를 임시로 저장하는데 사용할 수 있는 가변 컬렉션(mutable collection) 입니다. NSCache에 의해 캐싱된 데이터는 메모리가 부족할 때 일정한 규칙에 따라 제거될 가능성이 있습니다. NSCache는 클래스 앞에 NS가 붙는 것으로 유추할 수 있듯이, Objective-C 환경에서 구동된다는 것이 특징입니다. NSCache는 Key, Val..

[Swift] Unicode Scalar와 String의 Random Access

서론 오늘 iOS Developers KR 카톡방에서 재밌는 사실을 알았습니다. (사실 공식 문서에 나와 있는 내용이라 이전에도 알고 있긴 했음 ㅎ;;;) 👨‍👩‍👧‍👧는 여러 개의 유니코드가 합체하여 이루어진 이모지라는 것인데요. 그래서 var emoji = "👨‍👩‍👧‍👧" print(emoji.count) //1 print(emoji.unicodeScalars.count) //7 count를 출력하면 1이지만 unicodeScalars를 출력하면 7이 됩니다. 오늘은 unicodeScalar에 대해 알아보고 String에서 Random Access를 지원하지 않는 이유도 엮어서 알아보겠습니다. Unicode 유니코드는 현존하는 전 세계의 모든 문자를 시스템에서 표현하고 다룰 수 있도록 고안된 표준입..

[Swift] O(1)로 제곱 수인지 확인하기

숫자가 x의 제곱 수인지 확인하기 특정 수가 x의 제곱 수인지 확인하는 방법은 많습니다. 가장 대표적으로 반복문을 이용하는 것이죠. while number >= 3 { if number % 3 != 0 { return false } number /= 3 } 이번 포스팅에서는 O(n)이 아닌 O(1)로 숫자가 x의 제곱 수인지 확인하는 방법에 대해 알아보려고 합니다. (알고리즘 문제를 풀다 알게 된 방법이에요! ㅎㅎ) n이 3의 제곱 수인지 판단한다고 가정합시다. 9는 3의 제곱수입니다. -> 9 % 3 == 0 27은 3의 제곱수입니다 -> 27 % 3 == 0, 27 % 9 == 0 ... 이 패턴을 살펴보면 (더 큰 3의 제곱수 % 작은 3의 제곱수) 값은 항상 0 입니다. 이는 "더 큰 3의 제곱수..

[Swift] isMultiple(of:) 소개

isMultiple(of:) 알고리즘을 풀다 isMultiple(of:)를 알게 되어 소개드리기 위해 포스팅을 작성합니다. 간단한 메서드지만 매우 편리하다고 느꼈거든요. isMultiple(of:)는 배수인지 판단하는 메서드입니다. 두 정수 a와 b에 대하여, a = q*b인 세 번째 정수 q가 존재한다면, a는 b의 배수이다. 예를 들어 6 = 2*3이므로 6은 3의 배수입니다. 0은 임의의 정수 x에 대해 0 = 0*x이므로 모든 것의 배수이다. 애플 공식 문서에 나와있는 isMultiple의 Declaration입니다. 메서드 정의를 통해 정수형만, 그중에서도 FixedWidthInteger 프로토콜을 준수한 정수형만 취급한다는 것을 알 수 있습니다. 예제 코드도 살펴봅시다. let number =..

[Swift] 공식 문서 - Memory Safety

새로 배운 점 Swift는 특정 메모리 공간을 수정하는 코드가 그 메모리의 소유권을 가지도록 요구함으로써 동일한 메모리 영역을 동시에 접근할 때 충돌하지 않도록 해줍니다. 메모리 액세스의 지속시간은 instantaneous(순간적) 또는 long-term(장시간)일 수 있습니다. 만약 액세스가 끝나기 전에 다른 코드가 실행될 가능성이 없다면 이 액세스는 순간적(instantaneous)입니다. 다른 코드의 실행에 걸쳐서 메모리에 액세스하는 여러 방법들이 있는데, 이를 장기간(long-term) 액세스라고 합니다. 오버랩(overlap)이란 장기간 액세스가 시작된 후 종료되기 전에 다른 코드가 실행되는 것입니다. 장기간 액세스는 다른 장기간 액세스 또는 순간적 액세스와 오버랩 될 수 있습니다. 함수는 모든..

[Swift] 깊은 복사와 얕은 복사(feat. NSCopying)

Value 타입과 Reference 타입 값(value) 타입과 참조(reference) 타입은 복사 방식이 다릅니다. 일반적으로 값 타입은 깊은 복사, 참조 타입은 얕은 복사가 발생한다고 알고 계실텐데요. 정말 그런지 알아보고 참조 타입이어도 깊은 복사를 할 수 있는 방법에 대해 알아봅시다. 깊은 복사(Deep copy) 깊은 복사는 데이터 자체를 복사하는 방법입니다. 각자 독립적인 메모리를 차지하기 때문에 복사한 인스턴스의 데이터를 바꾸더라도 원본에 영향을 주지 않습니다. 값 타입의 인스턴스들은 깊은 복사를 하게 되는데요. 아래는 Collection 타입인 Array를 복사하는 예제입니다. var arr: [Int] = [1, 2, 3] var copyArr = arr print("arr: \(arr..

반응형