Swift: 如何 return class 从函数中输入
Swift: how to return class type from function
我知道可以将 class 类型传递给 swift 中的函数:
func setGeneric<T>(type: T.Type){ }
setGeneric(Int.self)
但是我们如何 return 从函数中输入?写类似
的东西
func getGeneric<T>() -> T.Type {
return Int.self
}
给出编译器错误 "Int is not identical to T"。那么是否可以从 swift 函数中输入 return?
编辑
一些解释。我有 classes 用于持久性(我正在使用 Realm),我有 classes 作为这个 classes 的包装器。所有包装器都继承自 RealmClassWrapper
,它需要知道它实际包装的领域 class。所以假设我有这个领域模型:
class RealmTodo: RLMObject {
dynamic var title = ""
}
我的包装纸晚餐 class 看起来像这样:
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 }
}
是的,这是可能的。这里的问题是你说你的函数 return 是一个泛型 T.type
,但你总是 return Int.type
。由于 T 并不总是 Int,因此编译器会引发错误。
当我像这样修改你的函数时它起作用了:
func getGeneric<T>(object: T) -> T.Type {
return T.self
}
getGeneric(0) // Swift.Int
您可以return任何类型。
func getTypeOfInt() -> Int.Type { return Int.self }
func getTypeOfBool() -> Bool.Type { return Bool.self }
如果类型不是由参数决定的,或者如果 return 是常量,则不需要引入泛型 T
类型。
您可以强制向下转换 (as!),如下所示
func getGeneric<T>() -> T.Type {
return Int.self as! T.Type
}
但超出函数作用域,需要注明返回类型:
var t:Int.Type = getGeneric()
如果您不想指定 return 类型,您可以使用 AnyClass 作为模板参数。
class A {}
class B {}
public enum ExampleEnum: String {
case a
case b
func asClass() -> AnyClass {
switch self {
case .a:
return A.self
case .b:
return B.self
}
}
}
let myGoal : AnyClass = ExampleEnum.a.asClass()
您也可以避免最终转换为 AnyClass,但编译器会向您显示错误
我知道可以将 class 类型传递给 swift 中的函数:
func setGeneric<T>(type: T.Type){ }
setGeneric(Int.self)
但是我们如何 return 从函数中输入?写类似
的东西func getGeneric<T>() -> T.Type {
return Int.self
}
给出编译器错误 "Int is not identical to T"。那么是否可以从 swift 函数中输入 return?
编辑
一些解释。我有 classes 用于持久性(我正在使用 Realm),我有 classes 作为这个 classes 的包装器。所有包装器都继承自 RealmClassWrapper
,它需要知道它实际包装的领域 class。所以假设我有这个领域模型:
class RealmTodo: RLMObject {
dynamic var title = ""
}
我的包装纸晚餐 class 看起来像这样:
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 }
}
是的,这是可能的。这里的问题是你说你的函数 return 是一个泛型 T.type
,但你总是 return Int.type
。由于 T 并不总是 Int,因此编译器会引发错误。
当我像这样修改你的函数时它起作用了:
func getGeneric<T>(object: T) -> T.Type {
return T.self
}
getGeneric(0) // Swift.Int
您可以return任何类型。
func getTypeOfInt() -> Int.Type { return Int.self }
func getTypeOfBool() -> Bool.Type { return Bool.self }
如果类型不是由参数决定的,或者如果 return 是常量,则不需要引入泛型 T
类型。
您可以强制向下转换 (as!),如下所示
func getGeneric<T>() -> T.Type {
return Int.self as! T.Type
}
但超出函数作用域,需要注明返回类型:
var t:Int.Type = getGeneric()
如果您不想指定 return 类型,您可以使用 AnyClass 作为模板参数。
class A {}
class B {}
public enum ExampleEnum: String {
case a
case b
func asClass() -> AnyClass {
switch self {
case .a:
return A.self
case .b:
return B.self
}
}
}
let myGoal : AnyClass = ExampleEnum.a.asClass()
您也可以避免最终转换为 AnyClass,但编译器会向您显示错误