일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- swift documentation
- Refactoring
- ribs
- combine
- 리펙토링
- HIG
- Protocol
- MVVM
- RxCocoa
- swiftUI
- 리팩토링
- 애니메이션
- UITextView
- Clean Code
- rxswift
- SWIFT
- 스위프트
- uitableview
- clean architecture
- 클린 코드
- collectionview
- Xcode
- map
- Human interface guide
- tableView
- UICollectionView
- Observable
- 리펙터링
- uiscrollview
- ios
- Today
- Total
목록분류 전체보기 (1643)
김종권의 iOS 앱 개발 알아가기
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/v2uzr/btqJF0owJpT/zKPAVx3N7be5krd4CSQWZ1/img.png)
1. flatMap - Observable관련 이벤트를 받아서, 새로운 Observable 방출 let sequenceInt = Observable.of(1, 2, 3) let sequenceString = Observable.of("A", "B", "C", "D") sequenceInt .flatMap { (x: Int) -> Observable in print("Emit Int Item : \(x)") return sequenceString } .subscribeNext { print("Emit String Item : \($0)") } // Output Emit Int Item : 1 Emit String Item : A Emit String Item : B Emit String Item : C E..
핵심 subscribe할 경우, onNext를 써서 self...이렇게 접근하는 것을 지양 viewModel에서 Observer / Observable이 아닌 그냥 변수로 선언하는 것은 지양 (flag값도 그냥 flag = false로 쓰면 좋지 않음): test case작성 시, Observer변수가 테스트하기 용이 간단한 RxSwift, MVVM구조 설계 - 토글 버튼을 클릭하면 아래 label의 텍스트가 변하는 로직 핵심은, ViewController에서는 Input에 대한 바인딩 / ViewModel에서는 transform에서 비즈니스 로직을 처리하여 Ouput으로 반환 1) ViewModel프로토콜 생성 단, 프로젝트 생성시 UnitTest를 체크해야함 (체크 안하고 RxTest를 프레임워크에 ..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bUKQJd/btqIZnGundd/kNP4KXbpK9WJjs5ZGRGTp1/img.png)
1. 위 구조의 장점 - Framework가 독립적이라 바꾸기 쉬움 - UI, DB, server없이 비즈니스 rules들을 테스트 가능 - UI가 독립적이라 바꾸기 쉬움 (비즈니스 rules없이 바꾸기 가능) - DB종류에 대해 독립적 (DB종류가 바뀌어도, 바뀐 부분만 수정하면 똑같은 함수를 써서 똑같은 결과를 낼 수 있는 기대) 종합적으로, 각 레이어들이 바뀌어도 다른 레이어들이 모를 정도로 독립적인 구조라서 유지보수에 좋음 독립성: 결합도(모듈과 모듈과의 상호 의존 정도)는 낮게, 응집도(내부 모듈의 기능 집중도)는 높게 2. 위 레이어 구성을 사용할 때의 Rules 가장 중요 - 소스코드에서도 들어나야 함: 밖 layer에서 선언된 이름/함수/클래스 이름이, 내부에서 아예 불려지지 않아야함 - ..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/Ty2xv/btqI9o4bfKi/5i7rg0HBMmIycPPFSujV81/img.png)
1. Main Run Loop과 Update Cycle 앱 실행시, iOS의 UIApplication이 메인 스레드에서 main run loop를 실행 - main run loop: 각종 이벤트들을 관찰하며, 그 이벤트들을 처리, 각 이벤트들에 맞는 핸들러를 찾아서 그들에게 권한을 위임 (버튼 클릭, 가로 모드전환, 위치 변화) - update cycle: 이벤트 핸들러들이 처리하여 계산한 값을 토대로 UI가 실제적으로 반영되는 시점 2. setNeedsLayout과 layoutIfNeeded - 둘 다 UIView 의 메소드 - 둘 다 최종적으로 layoutSubViews()메소드를 호출하는 예약 메소드 1) layoutSubViews() - View의 레아아웃을 호출한 즉시 변경해주는 메소드 (단, ..
@propertyWrapper란? @propertyWrapper: 프로퍼티를 한번 감쌓아서 get, set을 wrapping 사용할땐 struct이름 어노테이션으로 접근 예시1) @propertyWrapper를 통해서 항상 10보다 작은 값을 유지하는 property 만드는 방법 TenOrLess라는 wrapper를 통해 10이하의 수만 리턴되도록 하는 변수 정의 @TenOrLess var value: Int value = 12 print(value) // 10 어노테이션으로 접근할 struct의 이름 위 @propertyWrapper 기입 @propertyWrapper struct TenOrLess { // wrappedValue 정의 } var wrappedValue라는 이름의 computed-pro..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/vWnI4/btqHvKCKmxd/R9kmoUbWbJwIwJAOlK7vtK/img.png)
2번째 커밋포인트에 있는 내용을 "secnonds"로 바꾼 후, 커밋 메세지는 "modefied-2"로 바꾸고 싶은 경우 원리: 2커밋포인트 뒤에 새로운 커밋포인트 생성 -> 두 커밋포인트를 squash(합치기) 1. 수정하려는 바로 직전의 커밋 포인트로 rebase interactive: msg-1 커밋메세지가 찍혀있는 커밋포인트에 Rebase interactive 체크(amend commit) 후 ok버튼 HEAD가 2를 가리키는 것을 확인 (현재 rebase interactive를 진행하고 있는 상황) 2. HEAD가 2이므로 여기서 수정 후(커밋까지 완료 후) rebase continue를 하면, 수정된 내용이 2 뒤로 새로운 커밋포인트가 rebase될 것 1) 수정 2) 커밋 -> 커밋포인트 확..
NFD Mac OS에서 한글을 저장하는 방식 : NFD(Normalization Form Canonical Decomposition) "한글.txt"저장 -> "ㅎㅏㄴㄱㅡㄹ.txt"로 풀어서 유니코드로 저장 ex) 보통 mac에서 window로 파일을 전송할 때, window에서 파일을 열어보면 한글 자소가 분리되어 있는걸 발견 NFC Windows OS에서 한글을 저장하는 방식: NFC(Normalization Form Canonical Composition) "한글.txt"저장 -> 그대로 병합하여 유니코드로 저장 swift에서 UILabel에 문구를 넣을 때 NFD로 표현되는 경우 - NFC로 변환 let sample = "한글" lblTitle.text = sample.precomposedStri..
codable을 사용하여 json데이터를 가져오는 것 json자료형을 직접 파싱해서 사용하는 것은 코드상의 복잡함이 따름 -> 미리 struct형을 정해놓고 거기에 매핑되게끔하는 방법 case #1. 일반적인 사용방법 // json데이터 형태를 미리 정의 struct DataForm: Codable { var key_name1: String? var key_name2: String? } // json데이터 let sample = """ { "key_name1": "value1", "key_name2": "value2" } """.data(using: .utf8)! // 결과 let result = try! JSONDecoder().decode(DataForm.self, from: sample) print..