일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 하향식 접근
- 다형성
- iSP
- 설계 재사용
- 명령-쿼리 분리
- 메서드를 통한 해결
- 상속 조합 폭발적 증가
- OOP
- 알고리즘
- 의존성
- 서브 타이핑
- 합성
- '기존 설계 재사용
- 상속
- 오브젝트
- Apple # HIG #iOS15 #iOS14 #Human #Interface #Guidelines #Apple developer # Apple human interface guidelines
- 믹스인
- 객체 생성 사용 분리
- 행동 호환성
- 추상화
- 책임주도설계
- 객체지향
- 런타임 의존성
- Swift#flatMap#map#Monad#함수형 프로그래밍#Optional
- 일관성 있는 협력
- 유여난 설계
- OCP
- 컴파일 타임 의존성
- dip
- 유연한 설계
- Today
- Total
목록Swift (12)
도니의 iOS 프로그래밍 세상
함수형 프로그래밍에서 사용되는 말인 Monad에 대해서 설명하기 전, map 과 flatMap 의 차이점에 대해서 공부해보자 map과 flatMap은 차이점은 무엇일까? 가장 기본적인 차이점 map의 경우 데이터를 변환하는데 사용된다 let cast = ["Vivien", "Marlon", "Kim", "Karl"] let lowercaseNames = cast.map { $0.lowercased() } // 'lowercaseNames' == ["vivien", "marlon", "kim", "karl"] flatMap은 2차원 이상의 배열들을 1차원 배열로 변환한다 let numbers = [1, 2, 3, 4] let mapped = numbers.map { Array(repeatin..
지난 시간에는 async let을 사용하여, concurrent하게 이미지를 다운로드 받는 방법에 대해 알아보았습니다. 이번시간에는 전부 async let을 처리하는것이 아닌, group Task라는 기능을 이용하여 작업을 병렬적으로 실행하는 방법에 대해서 이야기하겠습니다. 지난 포스팅을 보지 않으셨다면, async let(3)를 보고 오시면 이해가 더욱 쉽습니다. Group Task가 필요한 이유 async let은 비교적 간단하게 병렬적으로 이미지를 다운받을 수 있는 기능입니다. 하지만, async let의 한계는 static하게 결정된 task에서만 사용이 가능하다는 것입니다. 위 코드에서 보듯, 분명하게 두개의 child task가 생성될 거라는 점이 컴파일 시점에서도 이를 명확하게 알 수 있습니..
이번 시간에는 swift concurrency에서 Parallel 실행을 지원해주는 기능인 async let에 대해서 배워보도록 하겠습니다. 결론적으로 말하자면, 해당 기능을 사용함으로써 Serial하게 동작되었던 async 함수들이 Concurrent하게 실행 되도록 합니다. 기존 Async함수 호출시 문제점 우리는 async await 기술을 사용하여, 중첩된 클로저를 사용한 위의 코드를 밑의 코드와 같이 더욱 간결하게 바꿀수 있게 되었습니다. 하지만, 여기서 한가지 문제점이 떠오릅니다. 만약 수백개의 사진을 다운받는 코드라고 가정한다면 위의 코드는 어떻게 작동할까요? 위의 예제와 같이 순서대로 사진을 다운로드 받습니다. 좀더 간단한 용어로 표현하자면 “Serial(동기)”하게 작동되는 형태입니다. ..
Try - Catch 공부배경 Swift Concurrency에서 가장 큰 장점중 하나는 에러처리입니다. 기존에 Result Type을 사용하거나, nil을 completion handler를 통해서 전달할 필요가 없어졌기 때문입니다. 단순히 async함수에 throws라는 키워드만 붙임으로써 보다 간단하고 실수없는 에러처리를 할 수 있습니다. async 함수를 잘 적용하기 위해서 try catch가 언제 작동하며, 이들이 언제 에러를 전달하고 시스템 종료를 유발시킬수 있는지 알아야 합니다. Swift Error Handling 에러 던지기(Throwing Errors) Swift에서 Error는 Error Protocol을 준수하는 타입의 값으로 나타납니다. 해당 프로토콜을 채택하는 어떤 타입이든지간에..
1. Swift Concurrency의 도입 배경 iOS 13.0부터 도입된 Swift Concurrency는 비동기 프로그래밍을 보다 편리하게 할 수 있습니다. 그전에, Escaping closure를 사용해서 비동기 처리하는 방식의 문제점은 두가지였습니다. 첫번째로, 가독성이 좋지 않고, 복잡한 코드일수록 중첩된 클로저를 계속해서 작성해야 합니다. 두번째로, 중첩 클로저를 작성하며 에러코드 작성까지 완벽하게 하는 것은 힘들며 이로인해 프로그램 버그를 유발할 수 있습니다. 밑에 코드를 살펴보시죠. 해당 함수는 썸네일 이미지를 다운로드 받는 함수입니다. 이때, 이미지를 서버로부터 다운로드 받을때 escaping closure가 호출됩니다. 그리고 받은 데이터를 가지고 다시 prepareThumnail이라..
지난 포스팅글에서는 ARC의 정의, weak unowned, strong reference cycle, closure와 clousure 순환참조에 대해서 알아봤습니다. 이번 시간에는 UIkit에서 흔하게 발생할 수 있는 delayed deinitialization, memory leak에 대해서 알아보겠습니다. Escaping Closure와 Non-escaping closure 두가지 사례로 나뉩니다. Escaping Closure에서의 Memory leak Escaping Closure는 함수가 반환된 후 호출되는 클로저를 의미합니다. 해당 클로저는 함수가 실행이 완료된 이후에도 별도로 동작하기 때문에 클로저 실행이 완료되어야 메모리에서 해제가 가능합니다. 이러한 성질로 인해 메모리 leak을 유발시..
안녕하세요, 지난 시간에는 ARC의 정의, Strong Reference Cycle, weak unowned의 차이에 대해서 공부했습니다. 이번 시간에는 weak unowned의 예시로 들었었던 View Controller의 클로저 내에서 weak self를 해주는 이유를 바로 알고는 싶지만, 그 전에 closure, closure와의 순환 참조를 통해서 ARC 기초를 마무리하도록 하겠습니다! 클로저는 Reference type 클로저는 reference type이라는 걸 알고 계셨나요? 이전 포스팅에서도 말했듯, reference type의 경우 “참조”가 가능하고, reference count를 증가시키는 것 또한 가능합니다. 그렇다면, closure와 “누군가”도 서로 참조를 일으키는 “순환 참조”..
안녕하세요, 지난 포스팅에선 Strong Reference와 그로 인해 발생하는 Strong Reference Cycle을 해결하는 방법에 대해서 배웠습니다. 그때 순환참조를 해결하기 위해서, 직접 참조를 nil로 지정해 Reference Count를 감소 시키는 방법, 참조를 weak, unowned reference로 함으로써 Reference Count를 증가시키지 않는 방법에 대해서 배웠습니다. 그럼 이번시간에는 weak, unowned는 무엇이며, 이들이 어떻게 Reference Count를 증가시키지 않았는지에 대해 배우겠습니다. Weak, Unowned 사용법 Weak와 Unowned의 가장 큰 공통점은 특정 객체를 참조할 때 Reference Count를 증가시키지 않는 것입니다. 이 두가..
안녕하세요, 지난 포스팅에선 ARC의 정의, ARC의 작동원리에 대해서 공부했습니다. 이번 포스팅에선 ARC의 Counting 방식으로 인해 생기는 Strong Referecne Cycle에 대해서 공부하곘습니다. Memory Leak 지난 포스팅에선, 객체에 대한 count가 0이 됐다면, 더이상 메모리에서 사용하지 않는다고 판단하고 자동으로 ARC를 통해 클래스 "객체"를 메모리로부터 Free 시킨다. 라고 하였습니다. 즉 누구도 해당 instance에 접근하지 못한다고 판단하면 메모리에서 deallocate 시키는 것입니다. 하지만, 누구도 instance에 접근하지 못하고, 사용하지 않음에도 메모리에서 deallocate가 이뤄지지 않으면 어떻게 될까요? Memory Leak이 발생할것입니다. S..
이전 포스팅에서는 Structure와 Class의 차이에 대해서 공부했습니다. 그때 Value Type인 Structure에서 반드시 값의 복사를 통해서 값을 전달한다고 했지만, 반드시 그런것은 아닙니다! Swift의 Structure의 추가 설명에서 Collection Type인 array, dictionary, String은 복사로 인한 퍼포먼스 코스트를 줄이기위해 최적화된 별도의 방식을 사용합니다 라고합니다. 그것이 오늘 소개할 COW(Copy On Write)입니다!! Swift에서의 COW(Copy On Write) 스위프트 문서상의 설명으로는 복사를 즉각적으로 하지 않고, collection들은 값들이 저장된 메모리를 원본 객체와 복사본들끼리 공유합니다. 만약, collection의 복사본들중..