簡體   English   中英

Swift:如何從 function 返回 class 類型

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM