iOS/Swift
-
[Swift] Generic에서 Method DispatchiOS/Swift 2022. 8. 22. 20:17
iOS 개발자라면 꼭 시청해야 한다고 생각하는 WWDC 세션인 Understanding Swift Performance의 내용 중 Generic code 파트에 대해서 공부하며 적은 글입니다. 출처는 알아보기 쉽도록 각 단락마다 적어놓았습니다. Generic Generic code는 더욱 정적인 형태의 polymorphism을 구현할 수 있도록 도와줍니다. 이것을 parametric polymorphism이라고도 부릅니다. "One type per call context" (protocol을 이용했을 때에는 struct를 사용하더라도 메서드가 동적으로 결정되는 부분이 있었는데, generic은 그게 아니라는 뜻인 것 같습니다.) 이제부터 위에 한 말이 무슨 뜻인지 알아보겠습니다 Generic으로 만들어진..
-
[Swift] Protocol에서 Method dispatchiOS/Swift 2022. 8. 21. 19:31
iOS 개발자라면 꼭 시청해야 한다고 생각하는 WWDC 세션인 Understanding Swift Performance의 내용 중 Protocol types 파트에 대해서 공부하며 적은 글입니다. 출처는 알아보기 쉽도록 각 단락마다 적어놓았습니다. Polymorphism with struct polymorphic code를 struct로 작성하는 방법은 무엇일까요? 영상에서는 POP(Protocol oriented programming)이라고 답합니다. 그렇다면 protocol을 사용할 때 method dispatch가 어떻게 동작하는지도 알아야 할 것입니다. 이번에는 이전의 예시에서 부모 클래스를 protocol로 바꿨습니다. 각 struct는 protocol을 채택하여 구현했고, 때문에 상속관계가 없..
-
[Swift] Method dispatch와 V-TableiOS/Swift 2022. 8. 20. 22:11
iOS 개발자라면 꼭 시청해야 한다고 생각하는 WWDC 세션인 Understanding Swift Performance의 내용 중 Method dispatch에 대해서 공부하며 적은 글입니다. 출처는 알아보기 쉽도록 각 단락마다 적어놓았습니다. Static Dispatch 컴파일 타임에, 실행될 구현체를 결정할 수 있습니다. 런타임 시 올바른 구현체로 직접 jump 할 수 있습니다. (메모리 상에서 해당 코드의 주소로 이동하는 것이 jump로 표현되는 듯하다. 어셈블리어와 비슷한 느낌) 이 경우 컴파일러가 어떤 구현체가 실행될 것인지에 대해서 가시성을 가질 수 있습니다. (어떤 구현체가 실행될지 안다) 또, inlining과 같은 매우 적극적인 최적화 기법을 사용할 수 있습니다. Dynamic Dispa..
-
[백준] 18258 큐 2 - SwiftiOS/Swift 2022. 6. 10. 16:40
문제분석 문제 자체는 매우 간단하다. 큐를 구현해서 입력으로 주어지는 query에 대해서 큐 연산을 처리하면 된다. 하지만 Swift로 이 문제를 해결할 때에는 몇가지 주의사항이 있다. Swift는 표준입출력이 느리다. Array의 removeFirst()의 시간복잡도는 O(N)이다. 1번으로 인해서 입출력에 대한 처리를 해 주어야 하고, 2번으로 인해서 효율적인 큐를 구현할 방법을 생각해야 한다. 위 주의사항 때문에 이 문제를 Swift로 해결하기 매우 까다롭다. 첫 번째 사항에 대해서는 아래 gist의 글을 참고하면 된다. 이해는 하기 어려울 것이다. https://gist.github.com/JCSooHwanCho/30be4b669321e7a135b84a1e9b075f88#file-usage-swi..
-
[Swift Grammar] Guard구문에서의 non-Optional 선언iOS/Swift 2022. 5. 11. 14:50
한 줄 요약 (guard) case let을 사용해 선언해주면 된다. 본문 가끔 guard구문에서 여러가지 조건을 추가하기 위해서, non-Optional의 새로운 변수를 선언해야 하는 경우가 생긴다. guard구문 안에서 변수를 선언하게 되면, 해당 변수가 optional인지 아닌지에 대한 검사를 통해 Early exit이 이루어진다. 즉, guard구문 안에서는 항상 Optional 변수가 선언되어야 하므로, non-Optional 변수에 대해서는 오류가 발생한다. 이 때 case let을 사용해 선언해주면 오류를 해결할 수 있다. 예시를 통해서 자세히 알아보면 다음과 같다. 예시 SwiftUI에서, symbolName을 String으로 입력 받아, symbolName에 대응하는 systemName을..
-
[TIL] 참조와 캡쳐iOS/Swift 2022. 1. 11. 18:21
일단 weak, unowned 키워드에 대해 배우고 캡쳐까지 확장했다. 참조 카운트, ARC에 대한 키워드인데, 이것을 이해하려면 참조 카운트에 대한 이해가 필요하다. 매우 장황한 주제지만, 하나씩 차근차근 공부해보며 작성해봐야겠다. 참조카운트(Reference Count) 간단하게 객체가 참조되고있는 개수를 표현한 용어이다. 객체를 생성하기만 해도 참조가 생기기 때문에 기본적으로 RC는 1이라고 볼 수 있다. RC가 0이라는 것은 더이상 아무도 그 객체를 필요로하지 않는다는 뜻이기 때문에 메모리 해제를 해 주어야 한다. 이런 상황에서 메모리 해제를 OBJ-C에서는 직접 해줬다고 하는데,, C++을 사용하는 느낌이였을 것 같다. 직접 메모리 관리를 해주는 것을 MRC(Manual Reference Cou..
-
[TIL] COW(Copy on Write)iOS/Swift 2022. 1. 10. 18:58
COW(Copy On Write)는 말 그대로 "값을 기록할 때 복사가 일어난다"는 뜻이다. 찾아보니 Memory Management분야에서 Optimization기술 중 하나로 쓰이고 있다고 한다. Swift에서도 Optimization기술로 쓰이고 있다. COW는 CollectionType에서 적용이 된다. CollectionType은 Struct로 구성되어있기 때문에 ValueType이다 아래는 두 변수를 따로 선언해 주었을 때 발생하는 메모리 상황이다. let a = [1...30] let b = [1...30] ValueType에서는 대입연산자를 사용할 때 값복사가 일어난다. 하지만 COW가 적용됨으로 인해 메모리주소가 복사되는 현상이 발생한다. let a = [1...30] let b = a ..