일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- SWIFT
- rxswift
- ribs
- HIG
- 리팩토링
- uitableview
- ios
- tableView
- 리펙터링
- uiscrollview
- swiftUI
- Refactoring
- UICollectionView
- RxCocoa
- UITextView
- Clean Code
- combine
- MVVM
- Observable
- swift documentation
- Xcode
- map
- 애니메이션
- clean architecture
- 클린 코드
- Protocol
- collectionview
- Human interface guide
- 리펙토링
- 스위프트
- Today
- Total
목록Refactoring (리펙토링) (58)
김종권의 iOS 앱 개발 알아가기
예외처리 throw를 하고 사용하는쪽에서 try - catch하는 예외처리를 모르는 개발자는 없지만 예외처리를 잘 활용하는 방법을 깨닫는것도 중요 swift에서 보통 메서드를 작성하다가 특정 상황에서는 guard문을 사용한다거나 if문을 사용하여 특정 부분에서만 동작하도록 하는 것이 대부분 예외처리의 중요성 확장성 증가 보통 메서드나 함수를 작성할 때 특정 기능이 필요해서 만드는데, 이렇게 되면 메서드 내부에서 예외적인 사항들을 guard문이나 if문으로 처리하는데 이렇게 처리하게 된다면 특정 상황에서만 사용할 수 있는 코드로 존재 ex) 인수로 들어오는 view의 subview들을 대상으로 UIStackView의 색상을 추출해내는 함수 func getStackViewColor(parentView: UI..
튜플 리턴 리펙터링 보통 특정 함수에서 return 타입이 하나인 경우가 대다수 UIView에서도 frame값을 가져오는 메서드의 리턴타입이 CGRect하나 경우에 따라서는 return 타입을 튜플로 만들고 튜플에서, 사용하는쪽에 필요한 정보를 같이 넘기게하면 유용한 코드 유지가 가능 Bool타입과 같이 튜플형태로 리턴하기 특정 메서드에서 일을 수행한 후 그 결과를 사용하는쪽에 넘겨주는데 이 때, 튜플형태로 Bool 타입과 같이 넘겨주면 사용하는쪽에서 더욱 이해하기 쉽고 사용하기 쉬운코드 유지가 가능 ex) 메서드를 사용하는쪽에서 그 메서드의 결과로 인해 true or false를 판단하여 일을 수행해야하는 경우, 사용하는쪽에서 true or false를 구분짓지 말고 메서드에서 Bool타입과 같이 리턴..
용어 *메서드: 객체가 가지고 있는 하나의 행위 *함수: 객체없이 단독으로 있는 하나의 기능 (* 이 글에서는 편의상 메서드도 함수로 지칭) 함수의 파라미터 리펙토링 함수의 정의는 하나의 일을 하는 기능 단위로 볼 수 있다는 것은 유명한 의미 하지만 함수에서 인수와 파라미터를 사용할 땐 그저 함수 안에서 필요한 것을 넣는 경우가 존재 가장 위험한 코드는 함수 파라미터에 또 다른 struct나 class타입을 넣는 것 ex) 주식 정보 제공 앱을 만들 때, Candle이라는 구조체를 사용하는 경우 calculateMiPriceString 함수에서 candle 인스턴스를 받아서 candle안의 메서드를 호출하여 특정 문자열을 가져오는 함수 import UIKit struct Candle { var open:..
조건문 리펙터링 Xcode15 이상, Swift5.9부터 조건문들을 모두 하나의 표현식으로 간주할 수 있으므로 더욱 간결하게 표현이 가능 if, else 리펙터링 swift5.9 미만 버전에서는 if, else 분기문에 따라 값이 달라질 때 바로 위에 UIColor라는 타입만 명시하는 프로퍼티를 선언 let count = Int.random(in: 0...100) let color: UIColor if count % 2 == 0 { color = .blue } else { color = .red } 또는 closure를 사용하여 반환 let newColor = { if count % 2 == 0 { return UIColor.blue } else { return .red } }() 조건문을 사용할 때 c..
1. weak self 동작 이해하기 - retain cycle이 발생하는 경우 2. weak self 동작 이해하기 - 외부에 weak self 선언하고 클로저에서 사용하는 경우 (#캡처리스트 [weak self] 리펙토링) weak self를 클로저 외부에서 사용 시 retain cycle이 발생할까? 예제를 위해 retain cycle이 발생하는 코드 준비 class A { private var closureEscaper: ((String) -> ())? func escape(closure: @escaping (String) -> ()) { print("escaping!") closureEscaper = closure } } class B { var name = "Jake" let a = A() /..
guard문을 사용하여 과도한 들여쓰기 막기 guard문은 다른 언어에 거의 없고 swift언어에만 있는 문법 guard문의 의미는 코드의 흐름에서 막아야 하는 조건이라는 의미 guard를 사용하면 과도한 들여쓰기를 막고 읽기 쉽게 표현이 가능 ex) guard문 쓰기 전 func processUserInput(_ input: String?) { if let unwrappedInput = input { if unwrappedInput.count > 0 { if let intValue = Int(unwrappedInput) { if intValue >= 0 { print("입력한 값 > 양수") } else { print("입력한 값 > 음수") } } else { print("입력한 값 > 정수 x") ..
복잡한 조건문 보통 복잡한 조건문은 코드의 깊이가 길어지는 형태 ex) 아래처럼 맨 처음 깊이는 if-else이며, if문 하위에 또다른 if-else가 있고, else하위에 if-else가 있어서 총 깊이가 3개짜리인 조건문 let isUserLoggedIn = true let hasSubscription = false let isContentAvailable = true if isUserLoggedIn { if hasSubscription { print("사용자가 로그인하고 구독이 활성화되어 있습니다.") } else { if isContentAvailable { print("사용자가 로그인했지만 구독이 없습니다. 콘텐츠를 사용할 수 있습니다.") } else { print("사용자가 로그인했지만 구..
상속 관계를 제거하고 Wrapper 만들기 상속의 단점 (이전 포스팅 글에서 알아본 내용 복습) 단점1) 수퍼클래스와 서브클래스간의 결합도가 증가하여 부모를 수정하면 자식들의 기능을 헤칠 수 있음 단점2) 사람 객체의 동작이 나이대와 소득 수준으로 나뉜다면, 서브클래스를 부자와 서민으로 나눌 것인데 이렇게 된다면 각 서브클래스에서 하나의 인스턴스로 두 기능 모두 사용이 불가능한 상태 상속을 제거하려는 목적이 있고 새로운 기능이 별로 추가되지 않을 때 wrapper 모델을 만들고 여기에 추가 기능 확장을 하는 방식 ex) Person 이라는 모델이 있고 여기에 사람에 대한 정보가 있을 때, User라는 모델을 만들고 싶은 경우? struct Person { let name: String let age: I..