juhan_h
juhan_h

Reputation: 4021

How to pass a Swift type as a method argument?

I'd like to do something like this:

func doSomething(a: AnyObject, myType: ????)
{
   if let a = a as? myType
   {
       //…
   }
}

In Objective-C the class of class was Class

Upvotes: 39

Views: 23800

Answers (1)

Qbyte
Qbyte

Reputation: 13283

You have to use a generic function where the parameter is only used for type information so you cast it to T:

func doSomething<T>(_ a: Any, myType: T.Type) {
    if let a = a as? T {
        //…
    }
}

// usage
doSomething("Hello World", myType: String.self)

Using an initializer of the type T

You don’t know the signature of T in general because T can be any type. So you have to specify the signature in a protocol.

For example:

protocol IntInitializable {
    init(value: Int)
}

With this protocol you could then write

func numberFactory<T: IntInitializable>(value: Int, numberType: T.Type) -> T {
    return T.init(value: value)
}

// usage
numberFactory(value: 4, numberType: MyNumber.self)

Upvotes: 91

Related Questions