Как передать тип Swift как аргумент метода?

Я хотел бы сделать что-то вроде этого:

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

В Objective-C классом класса был Class

Ответы

Ответ 1

Вы должны использовать общую функцию, в которой параметр используется только для информации о типе, поэтому вы передаете ее в T:

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

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

Используя инициализатор типа T

Вы не знаете подпись T вообще, потому что T может быть любым типом. Таким образом, вы должны указать подпись в протоколе.

Например:

protocol IntInitializable {
    init(value: Int)
}

С помощью этого протокола вы могли бы написать

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

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