일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- swiftUI
- uiscrollview
- Xcode
- 리펙터링
- 스위프트
- Protocol
- Human interface guide
- rxswift
- 리팩토링
- ribs
- tableView
- RxCocoa
- 애니메이션
- Observable
- UICollectionView
- ios
- uitableview
- combine
- 리펙토링
- swift documentation
- Refactoring
- UITextView
- 클린 코드
- collectionview
- MVVM
- map
- Clean Code
- clean architecture
- HIG
- SWIFT
- Today
- Total
목록리펙토링 (45)
김종권의 iOS 앱 개발 알아가기
flag 관리하는 방법유사한 성격의 flag를 관리할때 보통 아래처럼 작성ex) 앱 유저 세팅에 관한 플래그를 관리하는 클래스class UserSettings { var isDarkModeEnabled: Bool var isNotificationsEnabled: Bool var isLocationServicesEnabled: Bool var isAutoUpdateEnabled: Bool var isPrivacyModeEnabled: Bool var isSoundEnabled: Bool var isVibrationEnabled: Bool var isEmailUpdatesEnabled: Bool var isTwoFactorAuthenticationEnabled..
일반적인 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:..