Подтвердить что ты не робот

Swift: как вернуть тип класса из функции

Я знаю, что можно передать тип класса в функцию в swift:

func setGeneric<T>(type: T.Type){ }
setGeneric(Int.self)

Но как мы можем вернуть тип из функции? Написание чего-то типа

func getGeneric<T>() -> T.Type {
   return Int.self
}

дает ошибку компилятора "Int не идентична T". Так можно ли вернуть тип из быстрой функции?

Edit
Некоторое объяснение. У меня есть классы, которые используются для сохранения (я использую Realm), и у меня есть классы, которые действуют как обертки вокруг этих классов. Все оболочки наследуются от RealmClassWrapper, которые должны знать, какой класс Realm он на самом деле обертывает. Поэтому давайте скажем, что у меня есть эта модель:

class RealmTodo: RLMObject {
   dynamic var title = ""
}

и мой класс укусов укусов выглядит следующим образом:

class RealmClassWrapper {
   private let backingModel: RLMObject
   //...
   func backingModelType<T>() -> T.Type{ fatalError("must be implemented") }
}

и фактическая оболочка:

class Todo: RealmClassWrapper {
   //some other properties
   func backingModelType<T>() -> T.Type{ return RealmTodo.self }
}
4b9b3361

Ответ 1

Вы можете вернуть любой желаемый тип.

func getTypeOfInt()  -> Int.Type  { return Int.self  }
func getTypeOfBool() -> Bool.Type { return Bool.self }

Если тип не определяется из аргументов или если значение константы постоянное, нет необходимости вводить общий тип T.

Ответ 2

Он работает, когда я изменяю вашу функцию следующим образом:

func getGeneric<T>(object: T) -> T.Type {
    return T.self
}

getGeneric(0)    // Swift.Int

Ответ 3

Вы можете заставить downcast (как!), как показано ниже

func getGeneric<T>() -> T.Type {
  return Int.self as! T.Type
} 

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

var t:Int.Type = getGeneric()

Ответ 4

Да, это возможно. Проблема в том, что вы говорите, что ваша функция возвращает общий T.type, но вы всегда возвращаете Int.type. Поскольку T не всегда является Int, компилятор вызывает ошибку.