[英]Swift: how to return class type from function
我知道可以將 class 類型傳遞給 swift 中的 function:
func setGeneric<T>(type: T.Type){ }
setGeneric(Int.self)
但是我們如何從 function 返回類型呢? 寫類似的東西
func getGeneric<T>() -> T.Type {
return Int.self
}
給出編譯器錯誤“Int 與 T 不相同”。 那么是否可以從 swift function 返回類型?
編輯
一些解釋。 我有用於持久性的類(我正在使用 Realm),我有一些類充當這些類的包裝器。 所有包裝器都繼承自RealmClassWrapper
,它需要知道它實際包裝了什么 Realm class。 所以假設我有這個 realm model:
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 }
}
您可以返回任何您想要的類型。
func getTypeOfInt() -> Int.Type { return Int.self }
func getTypeOfBool() -> Bool.Type { return Bool.self }
如果類型不是從參數確定的,或者返回是常量,則不需要引入通用T
類型。
當我修改你的函數時,它可以工作:
func getGeneric<T>(object: T) -> T.Type {
return T.self
}
getGeneric(0) // Swift.Int
您可以強制下傳(如!),如下所示
func getGeneric<T>() -> T.Type {
return Int.self as! T.Type
}
但是在函數范圍之外,您需要指明返回的類型:
var t:Int.Type = getGeneric()
是的,這是可能的。 這里的問題是你說你的函數返回一個通用的T.type
,但你總是返回Int.type
。 由於T不總是Int,編譯器會引發錯誤。
如果你不想指定返回類型,你可以使用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,但編譯器會向您顯示錯誤
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.