Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- swift documentation
- 스위프트
- map
- 리펙터링
- 리펙토링
- uiscrollview
- 클린 코드
- UICollectionView
- RxCocoa
- Human interface guide
- 리팩토링
- SWIFT
- Protocol
- tableView
- swiftUI
- Refactoring
- UITextView
- collectionview
- combine
- uitableview
- MVVM
- clean architecture
- ribs
- HIG
- rxswift
- 애니메이션
- Observable
- ios
- Clean Code
- Xcode
Archives
- Today
- Total
김종권의 iOS 앱 개발 알아가기
[iOS - swift] 예외처리로 리펙토링하기 (throw, try, catch) 본문
예외처리
- throw를 하고 사용하는쪽에서 try - catch하는 예외처리를 모르는 개발자는 없지만 예외처리를 잘 활용하는 방법을 깨닫는것도 중요
- swift에서 보통 메서드를 작성하다가 특정 상황에서는 guard문을 사용한다거나 if문을 사용하여 특정 부분에서만 동작하도록 하는 것이 대부분
예외처리의 중요성
- 확장성 증가
- 보통 메서드나 함수를 작성할 때 특정 기능이 필요해서 만드는데, 이렇게 되면 메서드 내부에서 예외적인 사항들을 guard문이나 if문으로 처리하는데 이렇게 처리하게 된다면 특정 상황에서만 사용할 수 있는 코드로 존재
ex) 인수로 들어오는 view의 subview들을 대상으로 UIStackView의 색상을 추출해내는 함수
func getStackViewColor(parentView: UIView) -> UIColor? {
let targetView = parentView
.subviews
.first { $0 is UIStackView }
return targetView?.backgroundColor
}
- return 타입이 Optional이므로 컬러가 있으면 해당 컬러값을 얻어내고, 컬러값이 없다면 nil을 리턴해주는 함수
- 당장 사용하는쪽에서는 stackView의 backgroundColor만 필요한 상황이므로 이렇게해도 만족하여 사용할 수 있지만, 추후에 color가 없거나 UIStackView가 없는 상황들에 대해서 별도의 처리가 필요한경우 이 함수를 변경해야하는 상황이 발생
- 반면 아래처럼 throws를 작성하면 사용하는 쪽에서 예외처리가 필요하면 수행하고 필요없으면 사용하지 않게끔 인터페이스를 열어두어 확장성있는 코드 유지가 가능
enum ViewStateError: Error {
case nonExisted
case nonColor
}
func getStackViewColorNew(parentView: UIView) throws -> UIColor {
let targetView = parentView
.subviews
.first { $0 is UIStackView }
guard let targetView else { throw ViewStateError.nonExisted }
guard let color = targetView.backgroundColor else { throw ViewStateError.nonColor }
return color
}
사용하는 쪽)
do {
let stackViewColor = try getStackViewColorNew(parentView: view)
} catch {
switch error as? ViewStateError {
case .nonExisted:
print("nonExisted")
case .nonColor:
print("nonColor")
case .none:
print("none")
}
}
}
- 하지만 예외처리를 하게된다면 try 키워드를 붙여주어야하므로 공통으로 사용되지 않는 코드라면 예외를 제공해주지 않게하여 코드의 유연함도 챙기기
정리
- 현재 필요한 메서드를 구현하려고 할 때, 여러곳에서 공통으로 사용할 수 있는 여지의 코드라면 Optional을 리턴해주지 말고 예외처리를 할 것 (확장성 제공)
'Refactoring (리펙토링)' 카테고리의 다른 글
[iOS - swift] enum에 공통 변수가 필요한 경우 리펙토링 방법 (wrapping) (0) | 2024.01.11 |
---|---|
[iOS - swift] 프로토콜로 리펙토링하기 (5) | 2024.01.05 |
[iOS - swift] 튜플을 활용한 리펙터링 (tuple refactoring, 튜플 리턴) (2) | 2023.11.29 |
[Refactoring] 메서드와 함수의 파라미터 리펙토링 (0) | 2023.11.19 |
[iOS - swift] 표현식을 이용한 조건문, 삼항 연산자, switch - enum 리펙터링 (Swift5.9) (3) | 2023.11.10 |
Comments