Notice
Recent Posts
Recent Comments
Link
«   2025/02   »
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
Archives
Today
Total
관리 메뉴

Jupyo's Daily Story

@dynamicCallable 본문

Swift

@dynamicCallable

JangJupyo 2021. 4. 7. 10:57
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 과 같은 다른 동적 프로그래밍 언어와 함께 작업하는 것이 편리해 집니다.

반응형