일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- collectionview
- map
- 클린 코드
- scrollview
- uiscrollview
- swift documentation
- Clean Code
- RxCocoa
- MVVM
- swiftUI
- combine
- uitableview
- clean architecture
- Protocol
- 애니메이션
- SWIFT
- 스위프트
- tableView
- UICollectionView
- Xcode
- 리펙토링
- Observable
- HIG
- Human interface guide
- rxswift
- ribs
- 리팩토링
- ios
- UITextView
- Refactoring
- Today
- Total
목록Refactoring (리펙토링) (59)
김종권의 iOS 앱 개발 알아가기
코드 수정 잘 하는 방법코드를 수정해야하는 경우, 어떻게 하면 효율적으로 할 수 있을까?기존 화면에 새로운 요구사항이 생겨서, 기존 코드를 수정해야 할 때 효율적으로 수정하는 방법?이름을 바꾸는 등 리펙토링이 필요할 때 효율적으로 수정하는 방법?코드를 작성하는 흐름을 생각해보면 무턱대고 코드를 수정하는 것보단, 목적지 먼저 수정하는 것이 효율적으로 수정하는 방법예를 들어, 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..
일반적인 방법 네임스페이스를 구성할 때 보통 해당 클래스 혹은 해당 블록 안에 선언하여 구현 ex) 커스텀 버튼을 만들 때 (MyButton) 안쪽에 struct Config를 선언하여 사용 public class MyButton: UIButton { public struct Config { public let backgroundColor: UIColor public init(backgroundColor: UIColor) { self.backgroundColor = backgroundColor } } private let config: Config public init(config: Config) { self.config = config super.init(frame: .zero) setupUI() } ..
enum에 공통 변수가 필요한 경우 ColorType이라는 enum이 있고 color타입들을 분류하는 case들을 나타내는 경우 여기에 defaultColor도 다 갖고 있게 하고싶은 경우? enum ColorType { case blue case black case green } ex) 단순히 associated type으로 설정 선언하는 곳, 사용하는 곳 모두 일일이 다 써줘야 하므로 복잡한 코드가 됨 enum ColorType { case blue(defaultColor: UIColor) case black(defaultColor: UIColor) case green(defaultColor: UIColor) } (사용하는쪽) let colorType = ColorType.blue(defaultCol..