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 }
}
Ответы
Ответ 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, компилятор вызывает ошибку.