일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Human interface guide
- Protocol
- collectionview
- UITextView
- tableView
- swiftUI
- uiscrollview
- 애니메이션
- 리펙토링
- 스위프트
- Clean Code
- Refactoring
- combine
- 리펙터링
- UICollectionView
- HIG
- uitableview
- rxswift
- swift documentation
- RxCocoa
- map
- Xcode
- ribs
- Observable
- MVVM
- 클린 코드
- 리팩토링
- SWIFT
- clean architecture
- ios
- Today
- Total
목록ios (1096)
김종권의 iOS 앱 개발 알아가기

SwiftUI의 Binding 바인딩이란 A가 변경될 때 같이 B도 변경해주어야하는 경우, A와 B를 바인딩 해놓으면 A가 변경되었을때 B는 자동으로 변경되게끔 하는 기법을 의미 SwiftUI에서의 바인딩은 property wrapper 형태로 존재 구체적인 @Binding 개념은 이전 포스팅 글 참고 Binding 인터페이스 @available(iOS 13.0, macOS 10.15, tvOS 13.0, watchOS 6.0, *) @frozen @propertyWrapper @dynamicMemberLookup public struct Binding { public var transaction: Transaction public init(get: @escaping () -> Value, set: @e..

Escaping closure에서의 self 캡쳐 value type인 struct의 mutating 키워드가 붙은 메서드에서, 클로저(escaping closure)내부에 self를 참조하는 경우에 발생 오류가 발생하는 이유 swift에서는 memory safety을 지키기 위해서 컴파일러 타임에 이런 케이스를 사전에 방어해주기 위해 이런 컴파일 에러를 표출 memory safety 개념은 이전 포스팅 글 참고 ex) memory safety하지 않은, memory access conflict 발생 코드 value타입에서 set과 get이 동시에 일어나는 경우 다시 돌아와서, "Escaping closure captures mutating 'self' parameter" 에러가 나는 이유? value ..
dataSource 관리 MVVM 구조에서 보통 dataSource를 사용할 때 아무런 큐 없이 구현하지만, 데이터 처리 최적화를 위해 background 시키고 싶은 경우 중간중간 DispatchQueue.global()를 사용하거나 커스텀 큐를 사용하는 경우가 존재 개발자가 실수로 DispatchQueue.global()를 사용하게 되면, 이 큐는 serial이 아닌 concurrent이므로 value type인 dataSource 배열을 수정과 동시에 읽기를 하다가 크래시가 발생하는 경우가 존재 크래시 - 이전 Memory Access Conflict 글 참고 이럴때는 커스텀 큐를 선언하여 관리하는것이 가장 좋은데, 먼저 queue의 종류를 이해가 필요 DispatchQueue의 종류 3가지 * 이..
상속 관계를 제거하고 Wrapper 만들기 상속의 단점 (이전 포스팅 글에서 알아본 내용 복습) 단점1) 수퍼클래스와 서브클래스간의 결합도가 증가하여 부모를 수정하면 자식들의 기능을 헤칠 수 있음 단점2) 사람 객체의 동작이 나이대와 소득 수준으로 나뉜다면, 서브클래스를 부자와 서민으로 나눌 것인데 이렇게 된다면 각 서브클래스에서 하나의 인스턴스로 두 기능 모두 사용이 불가능한 상태 상속을 제거하려는 목적이 있고 새로운 기능이 별로 추가되지 않을 때 wrapper 모델을 만들고 여기에 추가 기능 확장을 하는 방식 ex) Person 이라는 모델이 있고 여기에 사람에 대한 정보가 있을 때, User라는 모델을 만들고 싶은 경우? struct Person { let name: String let age: I..

서브 클래스를 델리게이트로 바꾸기 특정 타입에 따라 동작이 달라지는 경우, 주로 enum case로 분기하여 구현하지만 저번시간에 알아본대로(이전 글 참고) 상속 관계를 만들면 SRP를 지키면서 더욱 유지보수 하기 쉽게 코드 관리가 가능 공통 코드는 수퍼클래스가 책임지고, 각각의 기능은 서브클래스로 정의하여 각 하나의 역할을 담당하도록 구현하는 것 이처럼 서브 클래스의 장점도 많지만, 단점이 존재 단점1) 수퍼클래스와 서브클래스간의 결합도가 증가하여 부모를 수정하면 자식들의 기능을 헤칠 수 있음 단점2) 사람 객체의 동작이 나이대와 소득 수준으로 나뉜다면, 서브클래스를 부자와 서민으로 나눌 것인데 이렇게 된다면 각 서브클래스에서 하나의 인스턴스로 두 기능 모두 사용이 불가능한 상태 서브 클래스를 델리게이..

NSItemProvider 개념 drag and drop이나 copy and paste 동작 할 때 delegate나 데이터를 주입할 때 NSItemProvider가 등장하는데, 현재의 앱이 다른 앱에 데이터를 전달하는 목적으로 사용 drag and drop: 화면 하나에 여러개의 앱이 띄워져 있을 수 있는 경우, 다른 앱으로 drop하여 아이템을 전달할 때 이 provider에 담아서 전송 copy and paste: 복사를 할 때 어떤 데이터를 복사할지 provider에 입력이 가능 ex) UICollectionView를 사용하여 Drag and Drop 컬렉션 뷰를 만들 때 NSItemProvider가 등장 (drag and drop 구현 포스팅 글) [iOS - swift] DragDropColl..

케이스를 서브클래스로 바꾸기 특정 타입에 따라서 기능을 달리해야하는 경우 보통 enum case로 타입을 구분하고 하나의 파일에서 분기를 넣는데, 이렇게되면 하나의 역할에 대해서만 책임 (Single Responsibility Prinsiple, SRP)을 지키지 못하는 코드로 변동 SRP를 지키지 못하면 type에 대한 특정 동작이 하나의 파일에 섞여나게되어, type에 대한 기능이 수정되어야 할 때 특정 type과 관련없는 코드가 변경될 우려가 존재 변경사항에 대해 코드를 수정해야하는 개발자 입장에서는 변경하려는 type 외에도 다른 type들도 고려하게되어 수정하기가 쉽지 않게 유지 SRP를 지키도록 type으로 하나의 파일에 여러개의 역할에 대해 구분할 때, 서브 클래스로 만들면 유지보수에 용이 ..

DispatchQueue의 sync와 async 동작 main queue와 thread 구분하기 main thread는 single thread이며, 해당 작업을 처리하는곳이 queue async와 sync로 각각 queue에 작업 담기가 가능 DispatchQueue.main.async { // main queue에 async 작업 넣는 곳 } DispatchQueue.main.sync { // main queue에 sync 작업 넣는 곳 } ViewController를 생성하고 DispatchQueue.main 없이 코드를 작성하면 그 코드들은 모두 DispatchQueue.main.sync 큐에서 처리 class ViewController: UIViewController { override func..