Jupyo's Daily Story
@dynamicCallable 본문
728x90
반응형
※ 이 글은 아래 내용을 번역 및 참고한 글입니다. 오역 및 수정이 필요한 부분은 지적 부탁드립니다.
Swift: @dynamicCallable Made Simple
Learn how to create Dynamic Callable types in Swift with simple examples.
medium.com
Dynamic Callables in Swift
@dynamicCallable 은 Swift 5.0 이상에서 사용되는 유형을 직접 호출하는 새로운 방법입니다.
Dynamic Callable 사용을 보기 전에 간단한 예문을 먼저 보도록 하겠습니다.
struct Greeter {
func greet(name: String) {
print("Hi, \(name)")
}
}
let greeter = Greeter()
greeter.greet(name: "Nick") // Print "Hi, Nick"
greeter.greet(name: "Tim") // Print "Hi, Tim"
dynamicallyCall(withKeywordArguments:)
@dynamicCallable
struct Greeter {
func dynamicallyCall(withKeywordArguments args: KeyValuePairs<String, String>) {
for (_, value) in args {
print("Hi, \(value)")
}
}
}
let greeter = Greeter()
greeter(name: "Nick") // Print "Hi, Nick"
greeter(name1: "Nick", name2: "Tim") // Print "Hi, Nick", "Hi, Tim"
아마 gretter(name1: "Nick", name2: "Tim") 이 부분이 특히 이상하게 느껴질 수 있습니다.
실제로 이 코드는 아래와 동일합니다.
greeter.dynamicallyCall(withKeywordArguments: ["name1": "Nick", "name2": "Tim"])
위 진행 상황을 이해하기 위해 구현을 좀 더 자세히 살펴 보겠습니다.
- Greeter는 @dynamicCallable로 표시하여 Dynamic Callable로 만듭니다.
- Greeter 구조체에는 dynamicallyCall(withKeywordArguments:) 메소드가 있습니다.
이 메소드는 위에서 본 것과 같은 직접 동적 호출을 담당합니다. - dynamicallyCall 메소드는 KeyValuePairs를 인수로 허용합니다. (KeyValuePairs은 단지 데이터 타입과 같은 딕셔너리입니다.)
예 : name: "Nick" - 위와 같은 dynamicallyCall 메소드 경우에는 단순히 인수로 전달 된 각 key-value 를 반복합니다.
dynamicallyCall(withArguments:)
@dynamicCallable
struct Greeter {
func dynamicallyCall(withArguments args: [String]) {
for name in args {
print("Hi, \(name)")
}
}
}
let greeter = Greeter()
greeter("Nick") // Print "Hi, Nick"
greeter("Nick", "Tim") // Print "Hi, Nick", "Hi, Tim"
위 예문에서는 key-value 대신 문자열 배열을 이용하였습니다.
key를 이용해 구분이 필요없고 같은 타입을 반복해서 사용하는 경우에는 훨씬 간단하게 처리할 수 있습니다.
결론
@dynamicCallable는 반드시 dynamicallyCall(withKeywordArguments:) 와 dynamicallyCall(withArguments:) 를 사용해야 합니다.
Dynamic Callables 를 사용하면 Swift 유형이 JavaScript 또는 Python 과 같은 다른 동적 프로그래밍 언어와 함께 작업하는 것이 편리해 집니다.
반응형
'Swift' 카테고리의 다른 글
포맷 지정자 (0) | 2022.11.18 |
---|---|
[문자열] 이메일 검증하기 (0) | 2022.11.17 |
What's new in Swift 5.4? (0) | 2021.02.19 |
WebKit에서 사용자 롱터치 방지 (0) | 2020.11.30 |
Swift 동시성 로드맵에 대하여 (About Swift Concurrency Roadmap) (0) | 2020.11.30 |