@Escaping (Escaping Closure)
- 함수의 파라미터로 받는 클로저가 함수 외부에서 실행 되는 경우 달아준다.
func asdf(closure: @escaping () -> Void) {
asyncMethod(callBack: closure())
}
- asdf메소드 실행시 내부 async의 콜백으로 클로저가 주어지고, asdf는 즉시 종료되기 때문에
- escaping closure가 아닌경우 asdf 메소드 종료와 함께 소멸되므로, escaping 처리가 필요하다.
@dynamicCallable
- class, struct, enum, protocol 에 붙힐 수 있으며, 내부 구현 함수를 즉시 실행 하도록 사용 가능하다.
- 해당 타입은 dynamicallyCall(withArguments:) 또는 dynamicallyCall(withKeywordArguments:) 혹은 둘다 를 구현 해야한다.
- withArguments 파라미터는 반드시 ExpressibleByArrayLiteral(배열형태) 프로토콜을 따르는 파라미터를 받아야 한다. return 타입은 어느 것이든 상관 없다.
- withKeywordArguments 파라미터는 반드시 ExpressibleByDictionaryLiteral(키, 밸류 형태) 프로토콜을 따르는 파라미터를 받아야 한다. 또한 파라미터에 해당하는 키값은 ExpressibleByStringLiteral 를 따라야 한다. 마찬가지로 return 타입은 어느 것이든 상관 없다.
@dynamicCallable
struct TelephoneExchange {
func dynamicallyCall(withArguments phoneNumber" [Int] {
...
}
}
let dial = TelephoneExchange()
dial(4, 1, 1)
dial.dynamicallyCall(withArguments: [4, 1, 1])
@dynamicCallable
struct Repeater {
func dynamicallyCall(withKeywordArguments pairs: KeyValuePairs<String, Int>) -> String {
...
}
}
let repeatLabels = Repeater()
//withKeywordArguments 로 사용시 아래와 같이 호출 가능하다.
repeatLabels(a: 1, b: 2, c: 3, b: 2, a: 1)
@frozen
enum 에서 더이상 추가 될 case가 없다는 의미로 붙여준다.
//frozen 이 없는 enum 의 경우
switch size {
case .regular:
case .medium:
case .large:
//frozen 이 없으니 추후 케이스가 추가 될 확률이 있기 때문에 unknown 을 달아 default설정을 해줘야 한다.
@unknown default:
error()
}
//frozen 이 있는 경우
switch size {
case .regular:
case .medium:
case .large:
}
- frozen 이 있는 경우 더이상 enum case가 변하지 않을 것임을 약속했기 때문에 default 및 @unknown 이 필요 없다.
'IOS' 카테고리의 다른 글
UIKit UIView 의 Frame 과 Bounds (0) | 2022.10.10 |
---|---|
Swift 접근 한정자 (0) | 2022.10.05 |
스위프트 Generic (0) | 2022.10.04 |
스위프트 Property Wrapper (0) | 2022.10.04 |
스위프트 키워드 (0) | 2022.10.04 |