일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 스위프트
- 클린 코드
- 리펙터링
- 리펙토링
- clean architecture
- HIG
- map
- RxCocoa
- ios
- Human interface guide
- 리팩토링
- SWIFT
- Xcode
- uiscrollview
- swift documentation
- collectionview
- uitableview
- swiftUI
- UICollectionView
- MVVM
- combine
- ribs
- rxswift
- Observable
- Clean Code
- tableView
- Protocol
- UITextView
- Refactoring
- 애니메이션
- Today
- Total
목록분류 전체보기 (1542)
김종권의 iOS 앱 개발 알아가기
1. Privacy manifest 개념, 사용해야하는 이유 (PrivacyInfo.xcprivacy) 2. Privacy manifest 적용 방법 (PrivacyInfo.xcprivacy) 3. Privacy manifest의 privacy report 사용 방법 Privacy Report 란? Xcode에서 앱을 빌드하여 앱스토에 제출 할 때, Xcode15에서는 앱 프로젝트의 모든 개인정보 보호 목록을 집계하고 선언된 데이터 사용을 요약하는 개인정보 리포트 생성이 가능 이 내용은 모두 PrivacyInfo.xcprivacy에 작성된 내용을 바탕으로 .pdf파일로 생성 Privacy Report 사용해보기 Xcode15 > Product > Archive 선택 빌드가 완료되면 목록에서 빌드된 프로..
1. Privacy manifest 개념, 사용해야하는 이유 (PrivacyInfo.xcprivacy) 2. Privacy manifest 적용 방법 (PrivacyInfo.xcprivacy) 3. Privacy manifest의 privacy report 사용 방법 Prvacy Manifest 작성 Xcode > 파일 생성 > privacy 검색 > App Privacy 선택 생성된 형태 손바닥 모양의 아이콘으로 되어 있고, plist처럼 표출 (최초 만들면 App Privacy Configuraton 키값만 있고 value값은 없으므로, 편의를 위해 유명한 라이브러리인 Alamofire에 어떻게 작성되어 있는지 확인) Alamofire깃을 clone하고 프로젝트를 열어 PrivacyInfo 파일을 확..
1. Privacy manifest 개념, 사용해야하는 이유 (PrivacyInfo.xcprivacy) 2. Privacy manifest 적용 방법 (PrivacyInfo.xcprivacy) 3. Privacy manifest의 privacy report 사용 방법 Privacy manifest 란? 앱을 사용하는 사람들로부터 연락처나 개인 정보를 수집할 때 왜 수집하는지 기입하는 것 애플에서는 2024년 봄부터 앱 심사때 privacy manifest 내용을 확인 왜 privacy manifest를 강제화하는지? 일종의 개인 정보 보호 보고서라고 할 수 있음 개발자와 사용자에게 명확하지 않은 방식으로 사용자 개인 정보 보호에 영향을 미칠 가능성이 있을 수도 있음 개인정보 매니페스트 파일을 제공하여 앱..
protocol 준수하는 모델 넘기기 ViewController에서 viewModel로 SomeModelable을 준수하는 모델을 넘겨야 하는 경우? 단, SomeModelable을 준수하는 모델은 여기서밖에 사용하지 않음 protocol SomeModelable { var a: Int { get } var b: String { get } } class ViewController: UIViewController { let viewModel = ViewModel() override func viewDidLoad() { super.viewDidLoad() viewModel.configure(model: /*여기!*/) } } class ViewModel { func configure(model: SomeMo..
tableView에 자동으로 설정되는 inset contentInsetAdjustmentBehavior 값은 os에서 자동으로 safe area를 고려하여 설정되는 getter 프로퍼티 open class UIScrollView : UIView, NSCoding, UIFocusItemScrollableContainer { @available(iOS 11.0, *) open var adjustedContentInset: UIEdgeInsets { get } ... } 이 값을 직접 set해줄수는 없기 때문에 "contentInsetAdjustmentBehavior"를 사용하여 조절이 가능 open class UIScrollView : UIView, NSCoding, UIFocusItemScrollableC..
UILabel의 높이 가져오는 경우 UILabel의 크기를 뷰가 다 그려지기 전에 static하게 알아와야하는 경우? UITableView와 UITableViewCell을 사용할때, 뷰가 다 그려지기 전에 모든 Cell의 크기를 알아와야하는 경우? (이때 만약 UILabel만 동적으로 변한다면 UILabel의 높이를 구해야하는 상황) UILabel의 높이 구하는 방법 sizeToFit()을 사용하여 구현 이 값을 사용하면 뷰의 내부 content크기에 맞게 즉각 계산됨 UIView의 extension 메서드이므로 UIView 계열은 모두 사용 가능 extension UIView { ... open func sizeToFit() } 알아내려는 UILabel의 속성을 그대로 주고 (text, numberOf..
@dynamicCallable 개념 Factory 패턴과 유사하지만 더욱 진화한 형태 한 예제로 enum으로 type을 명시하고, 메소드를 static으로하여 특정 값을 생성하는 유형 enum SomeModelFactory { static func make() -> Int {} } 아래에서 더 알아볼 dynamicCallable을 사용한 SomeModelFactory를 사용하면 별도의 메서드 호출 없이, 해당 인스턴스에 소괄호와 함께 값을 넣어서 바로 사용이 가능 값을 넣을때 argument label을 미리 모델에서 정의해준 값이 아닌 동적으로 아무 값이나 사용도 가능 (아래 c1(a:1, 2)) 예제에서 "a"값도 사용하는쪽에서 "b", "c" 아무런 값을 넣어도 무방 let c1 = SomeMode..
비즈니스 모델을 UI 모델로 변경하기 만약 MVVM을 사용한다면, API호출을 통해 얻은 데이터들을 ViewModel에서 받아오고 UI 쪽으로 다시 전달해주어야 하는데 정석으로는 UI / Domain / API 세 계층 모두 모델을 다르게하여 의존성을 줄이는 것이 이론적으로 좋은데 이 때 모델을 다르게하면 model간 변환하는 로직이 필요 Domain에서 UI모델로 데이터를 변환할 때, Factory 패턴을 사용하면 로직 분리가 용이 Factory라는 의미는 단순히 UI모델로 변경하는 작업 뿐만이 아닌, UI모델에서 필요한 값들도 같이 넣어주도록 구현 만약 api로부터 (age: 20)와 같은 값을 가져오는 경우 UI에서는 20살이라고 표현해야할 때 Factory에서 "20"과 "살"을 결합하여 생성하는..