일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 Code
- MVVM
- 리팩토링
- swiftUI
- Protocol
- uiscrollview
- 스위프트
- 클린 코드
- rxswift
- RxCocoa
- ribs
- Observable
- Refactoring
- combine
- tableView
- UICollectionView
- clean architecture
- ios
- uitableview
- swift documentation
- 애니메이션
- collectionview
- SWIFT
- Human interface guide
- UITextView
- HIG
- 리펙토링
- Xcode
- 리펙터링
- map
- Today
- Total
목록Refactoring (50)
김종권의 iOS 앱 개발 알아가기
일반적인 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? ..
일반적인 방법 네임스페이스를 구성할 때 보통 해당 클래스 혹은 해당 블록 안에 선언하여 구현 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..
프로토콜로 리펙토링하는 아이디어 리펙토링의 핵심: 기존에 있는 코드에 영향을 최소화 하는 것 리펙토링 대상에 해당하는 interface들을 모두 protocol을 만들어서 선언 기존에 있던 리펙토링 대상의 인스턴스에 protocol을 타입을 따르고 기존 구현체를 대입 protocol을 준수하는 새로운 구현체를 구현하여 기존것과 변경 리펙토링 전 코드 예제 ex) LogModel이라는 기능이 있고 이 모델을 2곳 이상에서 사용하고 있을때 LogModel내부 코드를 리펙토링 하고 싶은 경우? LogModel은 UI를 탭한 카운트를 기록하는 모델 struct LogModel { private var countOfTap = 0 private var latestDate: Date? mutating func ad..
용어 *메서드: 객체가 가지고 있는 하나의 행위 *함수: 객체없이 단독으로 있는 하나의 기능 (* 이 글에서는 편의상 메서드도 함수로 지칭) 함수의 파라미터 리펙토링 함수의 정의는 하나의 일을 하는 기능 단위로 볼 수 있다는 것은 유명한 의미 하지만 함수에서 인수와 파라미터를 사용할 땐 그저 함수 안에서 필요한 것을 넣는 경우가 존재 가장 위험한 코드는 함수 파라미터에 또 다른 struct나 class타입을 넣는 것 ex) 주식 정보 제공 앱을 만들 때, Candle이라는 구조체를 사용하는 경우 calculateMiPriceString 함수에서 candle 인스턴스를 받아서 candle안의 메서드를 호출하여 특정 문자열을 가져오는 함수 import UIKit struct Candle { var open:..
상속 관계를 제거하고 Wrapper 만들기 상속의 단점 (이전 포스팅 글에서 알아본 내용 복습) 단점1) 수퍼클래스와 서브클래스간의 결합도가 증가하여 부모를 수정하면 자식들의 기능을 헤칠 수 있음 단점2) 사람 객체의 동작이 나이대와 소득 수준으로 나뉜다면, 서브클래스를 부자와 서민으로 나눌 것인데 이렇게 된다면 각 서브클래스에서 하나의 인스턴스로 두 기능 모두 사용이 불가능한 상태 상속을 제거하려는 목적이 있고 새로운 기능이 별로 추가되지 않을 때 wrapper 모델을 만들고 여기에 추가 기능 확장을 하는 방식 ex) Person 이라는 모델이 있고 여기에 사람에 대한 정보가 있을 때, User라는 모델을 만들고 싶은 경우? struct Person { let name: String let age: I..