| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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
- SPM
- Run Script
- Tuist
- Tuist 모듈화
- ios
- SwiftLint
- 4.0.0
- 메모리 구조
- wasm
- Micro Feature
- Prod
- Swift Package Manager
- 아키텍쳐
- Swift
- Publish
- uFeature
- Module
- Dependencies.swift
- Build Phase
- swiftwasm
- rethrows
- Swift-Web
- dependencies
- Modular Architecture
- tuist 4
- SwifWeb
- XCConfig
- 모듈화
- Stencil
- Architecture
Archives
- Today
- Total
baegteun - iOS
[iOS - Swift] rethrows 본문
rethrows
- 파라미터로 전달받는 함수(Closure)가 Error를 던질 때 사용
- argument 내부에서 에러가 발생하면, 해당 argument에서 받은 Error를 다시 던질 수 있도록 명시
enum SomeError: Error {
case someError
}
func someFunc(callback: () throws -> Void) {
}
func someThrowableFunc() throws {
throw SomeError.someError
}
위와 같이 함수 정의할 시 callback()을 사용하려 하면
enum SomeError: Error {
case someError
}
func someFunc(callback: () throws -> Void) {
do {
try callback()
} catch {
print(error)
}
}
func someThrowableFunc() throws {
throw SomeError.someError
}
someFunc(callback: someThrowableFunc)
someFunc 내부 에서 Error를 처리해야 한다.
하지만 someFunc가 rethrows를 이용하면
enum SomeError: Error {
case someError
}
func someFunc(callback: () throws -> Void) rethrows {
try callback()
}
func someThrowableFunc() throws {
throw SomeError.someError
}
do {
try someFunc(callback: someThrowableFunc)
} catch {
print(error)
}
someFunc를 사용하는 곳에서 Error를 처리할 수 있다.
throws로 하면 안되나?
enum SomeError: Error {
case someError
}
func someFunc(callback: () throws -> Void) throws {
try callback()
}
func someThrowableFunc() throws {
throw SomeError.someError
}
do {
try someFunc(callback: someThrowableFunc)
} catch {
print(error)
}
someFunc를 throws로 처리해도 someFunc를 사용하는 곳에서 Error를 처리할 수 있다.
그렇다면 throws와 rethrows의 차이는 무엇인가?
import Foundation
enum SomeError: Error {
case someError
}
func someFunc(callback: () throws -> Void) rethrows {
try callback()
}
func someThrowableFunc() throws {
throw SomeError.someError
}
func someNonThrowableFunc() {}
someFunc(callback: someNonThrowableFunc)
rethrows를 가진 함수에 throws가 아닌 함수를 전달하면 Error처리를 하지 않는다.
하지만 throws를 가진 함수에 throws가 아닌 함수를 전달하면 Error처리를 해야한다.
이는 throws를 가진 함수는 내부에서 스스로 throw를 할 수 있고, rethrows를 가진 함수는 내부에서 스스로 throw를 할 수 없는 특성이 있기 때문인거같다.
그 외
부모 클래스의 throws는 자식클래스에서 rethrows로 override할 수 있다.
반대로 부모 클래스의 rethrows는 자식클래스에서 throws로 override할 수 없다.
프로토콜 함수에 throws가 있다면 rethrows로 구현할 수 있다.
반대로 프로토콜 함수에 rethrows가 있다면 throws로 구현할 수 없다.
'Swift' 카테고리의 다른 글
| Swift로 웹사이트를 만드는 방법 (3) | 2023.02.21 |
|---|---|
| [iOS - Swift] Swift의 메모리 구조 (0) | 2022.12.04 |
Comments