| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
- 클린 코드
- 애니메이션
- uitableview
- ribs
- Human interface guide
- swift documentation
- SWIFT
- UITextView
- swiftUI
- combine
- collectionview
- Refactoring
- MVVM
- Clean Code
- HIG
- tableView
- RxCocoa
- 리펙토링
- 리팩토링
- map
- rxswift
- ios
- 스위프트
- Protocol
- uiscrollview
- scrollview
- Xcode
- UICollectionView
- Observable
- clean architecture
- Today
- Total
목록ios (1132)
김종권의 iOS 앱 개발 알아가기
제네릭과 프로토콜제네릭컴파일 타임에 타입이 정의되므로 타입 안정성이 있고 성능이 높음(static dispatch)DI(Dependency Injection)에 취약함struct UserService { var items: [T] func firstItem() -> T? { return items.first }}프로토콜DI(Dependency Injection)에 유리함 (관련 글)dynamic dispatch이므로 성능이 안좋음struct UserService { var items: [UserRepresentable] func firstItem() -> UserRepresentable? { items.first }}static dispatch, ..
padding에 nil 할당의 의미padding을 설정할때는 nil이나 Double값을 할당 할 수 있는데, 차이가 존재padding에 nil을 할당하면 padding()과 같이 시스템에서 알아서 정해주는 default padding으로 세팅됨padding에 0을 할당하면 의미 그대로 여백을 주지 않는다는 의미그렇다면 뷰에 padding을 안썼을때 적용되는 것은?padding에 0을 할당한것과 동일주의) padding에 nil을 할당하면 padding을 안썼을때와 다르게, 시스템에서 알아서 정해주는 세팅이 되므로 주의할 것예시UI에서 토글을 누를때마다 padding 적용 여부를 보고 싶기 때문에 아래와 같은 if함수 정의extension View { @ViewBuilder func `if`( ..
중첩 case 커피를 구분하는 switch-case문이 있을때, associated value에 다른 타입이 있는 경우enum BeverageType { case coffee(coffeeType: CoffeeType)}enum CoffeeType { case latte}enum OrderInfo { case specialOrder(customerName: String, drink: BeverageType)}let order1: OrderInfo = .specialOrder(customerName: "jake", drink: .coffee(coffeeType: .latte))이것을 사용하는 주문 쪽에서는 타입이 여러개이므로 switch-case에서 아래처럼 여러 단계를 가져갈 수 있음Ord..
밀집된 코드와 분리된 코드코드 관점에서 밀집된 코드와 분리된 코드가 있는데 가끔 어떤 방식으로 코드를 구현해야하는지 고민이 될 때가 있음 cf) 응집도와 결합도: 흔히 알려진 개념인 응집도와 결합도는 모듈을 기준으로 한 모듈이 다른 모듈을 많이 의존한다면 결합도가 크고 응집도가 낮다고 함모듈 관점에서는 코드를 작성할때 모듈간에 최대한 모르게끔 하는 명확한 방법이 존재하지만, 모듈 내부에서 코드를 작성해나갈때 최대한 함수로 작성할지, 아니면 함수 없이 한곳에 작성할지 고민이 되는 경우가 있음ex) VC가 로드될때 로딩을 돌리고, 카페 이름을 가져와서 뷰에 반영한 후 로딩을 멈추는 코드1. 하나의 함수에 모든 과업 다 넣기func viewDidLoad() { super.viewDidLoad() loa..
데이터 넘기기A -> B -> C로 msg 라는 String 형태의 데이터를 넘겨야하는 상황일 때 아래처럼 구현이 가능단, C에서만 msg데이터가 필요한 상태class AViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() } @IBAction func goToB(_ sender: UIButton) { let bVC = BViewController(msg: "Hello from A") navigationController?.pushViewController(bVC, animated: true) }}class BViewController: UIView..
코드 수정 잘 하는 방법코드를 수정해야하는 경우, 어떻게 하면 효율적으로 할 수 있을까?기존 화면에 새로운 요구사항이 생겨서, 기존 코드를 수정해야 할 때 효율적으로 수정하는 방법?이름을 바꾸는 등 리펙토링이 필요할 때 효율적으로 수정하는 방법?코드를 작성하는 흐름을 생각해보면 무턱대고 코드를 수정하는 것보단, 목적지 먼저 수정하는 것이 효율적으로 수정하는 방법예를 들어, A화면, B화면이 있을 때 B화면에 필요한 정보를 A로부터 받고 있는 경우, 그 정보의 이름이 바뀌면 A화면을 먼저 수정하는 것보단 B화면을 먼저 수정해나가는 것이 효율적인 수정 방법단계) B화면을 먼저 수정 -> 빌드 -> A화면에서 컴파일에러 발생 -> A화면 코드 수정필요에 의해 수정한다는 흐름으로 수정하므로 더욱 효율적으로 수정..
ScrollView안에 Spacer 적용하는 케이스ScrollView안에 Spacer를 잘 활용해야하는 아래와같은 경우가 존재ex) button은 항상 디바이스 하단에 떠 있고, 그 뒤에 스크롤되는 2개의 텍스트가 있는 경우 ("iOS앱 개발 알아가기", "jake") 상단의 Text가 짧을때는, "jake" Text는 하단 SafeArea로 부터 56만큼 간격 유지상단의 Text가 길어져서 스크롤이 많이 가능하게되면 "jake"는 스크롤 영역이므로 스크롤 밑쪽에 위치상단이 짧은 텍스트상단이 긴 텍스트f구현방법은 상단 Text와 하단 Text 사이에 Spacer()를 넣고, 하단 패딩을 주는 방법이 있는데, ScrollView안에 Spacer()를 그대로 사용하면 동작하지 않음ex) ScrollView안..
Protocol 활용하여 모델 구성하는 방법프로토콜의 기능이 여러가지 있지만 그중에 모델을 구성할 때 유용하게 사용이 가능한 프로젝트에서 여러명의 개발자들이 동시에 일을 진행할때, 모델에 대한 구성을 어떻게 할 것인지 의사결정을 할때도 프로토콜을 활용하면 중복 모델 최소화가 가능사용하는 쪽에서 필요한 정보들을 Protocol로 정의하고 공통 모델에 이 Protocol을 준수하는 방법ex) Cafe라는 정보를 가지고 있는 모델과 API가 아래와 같은 경우struct Cafe { /// 카페 이름 let name: String /// 카페 위치 (주소) let location: String /// 영업 시간 (예: "08:00 AM - 10:00 PM") let..