john doe
john doe

Reputation: 9690

Accessing Typed Value of Generic Argument in Swift

I am trying to make a dispatch function which can take Payload as an argument. The Payload can be Int, String or any other type. I tried the following approaches but inside the dispatch function the payload.value is always T and not Int or String. Casting is an option but I thought that was the whole point of generics.

struct Payload<T> {
    let value: T
}

func dispatch<T>(payload: Payload<T>) {
    print(payload.value) // get the value as Int, String or some other type
}

let payload = Payload<Int>(value: 100)

let payload2 = Payload<String>(value: "FOO")

dispatch(payload: payload)
dispatch(payload: payload2)

Upvotes: 0

Views: 71

Answers (2)

Leo Dabus
Leo Dabus

Reputation: 236548

As you already know T is unconstrained so it can be any type. Your only option is to cast the value to the types you are expecting. You can simply switch the value:

switch payload.value {
case let value as Int:
    print("Int:", value)
case let value as String:
    print("String:", value)
default:
    print("some other type", payload.value)
}

Upvotes: 1

congnd
congnd

Reputation: 1282

Depends on what you want to get inside your dispatch, you can create a protocol and requires T to be conformed to that protocol.

protocol Printable {
    func printValue() -> String
}

struct Payload<T> {
    let value: T
}

func dispatch<T: Printable>(payload: Payload<T>) {
    print(payload.value.printValue()) // get the value as Int, String or some other type
}

extension String: Printable {
    func printValue() -> String {
        return self
    }
}

extension Int: Printable {
    func printValue() -> String {
        return "\(self)"
    }
}

Upvotes: 0

Related Questions