| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
- UICollectionView
- collectionview
- Refactoring
- Human interface guide
- swiftUI
- swift documentation
- RxCocoa
- rxswift
- ios
- uiscrollview
- SWIFT
- Observable
- tableView
- uitableview
- 클린 코드
- Xcode
- 애니메이션
- HIG
- clean architecture
- 리팩토링
- Protocol
- claude code
- UITextView
- 클로드코드
- map
- 리펙토링
- combine
- MVVM
- Clean Code
- 스위프트
- Today
- Total
목록Refactoring (리펙토링) (61)
김종권의 iOS 앱 개발 알아가기
밀집된 코드와 분리된 코드코드 관점에서 밀집된 코드와 분리된 코드가 있는데 가끔 어떤 방식으로 코드를 구현해야하는지 고민이 될 때가 있음 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화면 코드 수정필요에 의해 수정한다는 흐름으로 수정하므로 더욱 효율적으로 수정..
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..
일반적인 DataSource 관리 Section이 여러개이고 Item도 여러개인 경우, 보통 dataSource를 2차원 배열로 하거나, Section과 Item을 갖는 struct를 만들어서 관리 class ViewController: UIViewController { struct Section { var title: String var items: [String] } var sections: [Section] = [ Section(title: "header is a", items: ["A1", "A2"]), Section(title: "header is b", items: ["B1", "B2"]), ] let tableView: UITableView = {...} } extension ViewCont..
한곳에 방대해지는 코드 한곳에 여러가지의 프로퍼티, 메서드들이 들어가다보면 방대해지는 문제점이 존재 방대해지는 것을 막을 수 있는 방법은 로직을 위임하는 방법 (단순 코드 분리는 extension으로도 가능하지만 로직 자체를 위임하는 방법이 더욱 코드 관리에 용이) ex) 아래처럼 ViewController하나에서 여러 상태가 저장되고 계산하는 상태 현재는 프로퍼티와 func가 많이 없어서 복잡하지 않지만 계속 늘어나면 관리가 힘들어지는 현상이 발생 class ViewController: UIViewController { var info = 1 var sampleString = "str" override func viewDidLoad() { super.viewDidLoad() } func someFunc..
단순 열거 switch 형태 단순히 자연수를 입력하면 한글로 변환시키는 목적이 있을때 아래처럼 사용이 가능 extension Int { var asHangul: String? { switch self { case 1: return "하나" case 2: return "둘" case 3: return "셋" case 4: return "넷" case 5: return "다섯" default: return nil } } } print(1.asHangul) // "하나" 이렇게 사용하게되면 switch, case, return문이 여러개 들어가게 되면서 길어질 수 있기 때문에, dictinoary를 활용하면 조금 더 단순하게 표현이 가능 extension Int { var asHangulV2: String? ..
기초 개념) stored property와 computed property 메모리 관점 stored property - 별도의 메모리 공간 지정 o computed property - 별도의 메모리 공간 지정 x 사용 관점 stored property - 값을 저장 computed property - 접근하는 시점에 stored property들을 가지고 계산하여 반환 stored property를 사용할때 주의할 점 stored property를 사용하다보면 가장 큰 문제가, 상태 관리를 두 곳 이상에서 하는 경우가 발생 상태 관리를 두 곳 이상에서 하다보면 데이터 관리가 맞지 않아 코드 복잡도가 올라가는 현상이 발생 ex) 커스텀 뷰를 만드는데, ButtonWithImageView안에 또 다른 MyB..