Swift 127

[Swift] SOLID 원칙 with Swift

서론 최근에 디자인 패턴 글과 ViewController, ViewModel의 역할 분리 글을 작성했습니다. 해당 글들에서는 배경지식 없이도 이해가 되도록 표현을 풀어서 쓰다보니 정확성이 떨어진다고 느껴졌습니다. 이도저도 아니게 된 것 같아 보다 정확한 내용 전달을 위해 이후 관련 글에서는 "단일책임 원칙", "개방폐쇄 원칙" 등의 단어로 표현을 명확하게 하려고 합니다. 그런 의미로 이번 포스팅에서 SOLID 원칙에 대해 정리해보고, Swift와 iOS에서는 어떻게 적용할 수 있는지 알아보겠습니다. SOLID란 SOLID란 OOP(객체 지향 프로그래밍) 및 설계의 기본 원칙으로, 단일 책임 원칙 (Single Responsibilty Principle) 개방 폐쇄 원칙 (Open-Closed Princi..

[Swift] where문 활용법

서론 where은 Swift의 특정 제약을 거는 키워드입니다. 비슷한 효과를 내는 문법은 if문입니다. if문에 비해 where문은 낯설게 느껴질 수 있는데요. where문을 이용하면 가독성은 유지하면서 코드 길이를 줄일 수 있다는 사실을 알고 계시나요? 이번 포스팅에서는 그 방법에 대해 알아보겠습니다. for문과 where where문을 사용하면 for문 안의 if문을 없애고 코드를 줄일 수 있습니다. 아래는 0부터 100 사이의 5의 배수를 출력하는 코드입니다. //if문 for i in 0.. Bool where T: Equatable { return a == b } isEqual과 isEqualWithWhere는 모두 T에 특정 제약을 추가했습니다. 두 개의 차이는 미미하기 때문에 어떤 것을 선택..

[Swift] Protocol을 이용한 ViewModel 의존성 주입

* 초보 개발자의 학습 내용이므로 잘못된 점이 있을 수 있습니다. 잘못된 점을 댓글로 남겨주시면 정말 도움이 많이 됩니다. 필요성 MVVM에서는 ViewController가 ViewModel에 의존하고 있는 구조가 많습니다. 코드로 표현하면 class ViewController { var viewModel = ViewModel() ... } 이렇게 ViewController 내부에서 ViewModel을 직접 생성하는 구조입니다. 이런 구조는 ViewModel이 없으면 ViewController를 테스트할 수 없고, ViewController 재활용도 어렵다는 단점이 있습니다. 예를 들어, 리스트를 보여주는 ViewController가 있다고 합시다. 이 리스트는 영화 리스트가 될 수도 있고, 맛집 리스트..

[Swift] Enum을 이용한 ViewModel Output 정의

ViewModel Output의 필요성 이전 포스팅인 Enum을 이용한 ViewModel Action 정의을 보시면 한 가지 의문이 생길 수 있습니다. 바로 메서드의 반환 값이 다른 경우입니다. 예를 들어 아래와 같은 action 메서드가 있을 때 func action(_ actions: ViewModelActions) { switch actions { case .save(let data): save(data) case .delete(let data): delete(data) case .deleteAll: deleteAll() } } save, delete, deleteAll 메서드가 각각 다른 타입의 반환값을 가진다면 어떻게 해야할까요? 이때 필요한게 ViewModelOutputs 입니다. ViewMo..

[Swift] Enum을 이용한 ViewModel Action 정의

ViewModelAction의 필요성 MVVM 패턴에서 ViewModel은 비즈니스 로직을 정의합니다. ViewController에서는 ViewModel 객체를 통해 비즈니스 로직을 수행하는 메서드를 호출하죠. 이때, ViewModel에서 수행하는 액션들을 Enum으로 묶으면, ViewController가 ViewModel의 개별적인 메서드들을 직접 호출하는 것보다 명확하고 안전하게 메서드를 호출할 수 있습니다. 또한 개별 메서드를 private 접근제어자로 설정이 가능하여 캡슐화도 엄격해집니다. 그럼 이제 방법을 알아보도록 합시다. Enum ViewModelActions 정의 ViewModel의 Action들을 묶은 Enum을 정의합시다. enum ViewModelActions { case save(I..

[Swift] Dictionary Grouping

서론 Array를 포함한 Collection를 Dictionary로 묶고 싶은 상황이 있습니다. 예를 들면, 아래와 같은 ItemType Enum이 있다고 합시다. enum ItemType: Hashable, CustomStringConvertible { case old, new var description: String { switch self { case .old: return "old" case .new: return "new" } } } 그리고 이 Enum을 가지고 있는 구조체 Item이 있어요. struct Item: CustomStringConvertible { var name: String var type: ItemType var description: String { return name ..

[Swift] weak를 활용한 Linked List

링크드 리스트 링크드 리스트는 실제 개발에서도 자주 사용되는 자료구조로, 이전에도 포스팅을 작성한 적이 있습니다. [자료구조] Linked List(링크드 리스트) with Swift 안녕하세요. 개발하는 정주입니다. 오늘은 "Linked List(링크드 리스트)"을 정리하였습니다. 최근에 코딩 테스트를 준비하기 위해 알고리즘 포스팅만 잔뜩 적었는데요. 오랜만에 자료구조를 포스팅 jeong9216.tistory.com 오늘은 약한참조 키워드인 weak를 활용해 코드를 최적화한 양방향 링크드 리스트에 대해 포스팅하려고 합니다. LinkedListNode class LinkedListNode { var value: T var next: LinkedListNode? weak var previous: Linke..

[Swift] 프로토콜 기본 구현 정의하기 (extension Protocol)

필요성 프로토콜은 상속과 달리 프로토콜의 정의 부분만 추가된다는 장점이 있습니다. 상속은 부모 클래스의 모든 것을 받기 때문에 프로토콜보다는 무겁죠. 또, 프로토콜은 구조체를 이용해 다형성을 구현하는 핵심 기술이기 때문에 반드시 필요합니다. 그렇지만 프로토콜은 프로토콜에서 정의한 모든 것을 구현해야 한다는 번거로움(?)이 있는데요. 프로토콜을 확장(extension)하면 이를 해소할 수 있습니다. 프로토콜 확장 protocol Testable { func hello() func bye() } 실습을 위한 프로토콜입니다. (형편 없는 네이밍이지만 able은 꼭 붙여주는 ㅋㅋ) Testable 프로토콜에서는 hello와 bye 메서드가 있어서 Testable 프로토콜을 채택하면 두 개의 메서드를 꼭 구현해줘..

[Swift] 값 타입에서 참조 타입 사용 시 주의할 점(feat. isKnownUniquelyReferenced)

서론 이 주제는 옛날에도 다루긴 했지만 따로 한 번 더 다루는 것도 좋다고 생각해서 포스팅을 남깁니다. Collection -> Copy-On-Write -> isKnownUniquelyReferenced -> 이번 주제 라는 의식의 흐름 공부를 하고 있었고,,,, 사실 곧 면접이 있어서 포스팅하는 게 시간적으로 굉장히 큰 부담이지만,,, 그래도 기록해두면 저도 좋고 방문자님들도 좋고 좋은게 좋은거니.. ㅎㅎ 아무튼, 이번 포스팅에서는 구조체에서 참조 타입 사용 시 주의할 점에 대해 알아보겠습니다. (전체 코드는 최하단에 있습니다. 코드가 이미지라고 너무 노여워하지 마세요.) Value Semantics와 Reference Semantics Value Semantics 구조체는 값 타입이기 때문에 하나의..

반응형