2017-09-25 163 views
1

我有一個類實現Mappable協議,我想將類型作爲參數傳遞給函數並獲取該對象的實例,但該類型也可能是原始類型。從泛型類型的Swift實例化

class MyMappable : Mappable { 

    required init?(map: Map) { 

     print("i am custom mappable") 
    } 
} 

func getInstance<T>() -> T{ 

    if T.self == Int.self { 

     return 10 as T 
    } 

    if T.self is Mappable.self { 
     return T(Json : [:]) //this is the problem, T is not Mappable 
    } 

} 

我想的是創建這樣的2佔優的getInstance:

func getInstance<T>() -> T{} 

func getInstance<T : Mappable>() -> T{} 

但更多類型的它可以大量替代的。 有沒有辦法讓swift知道T在第一個函數中是可映射的?

回答

0

可以有條件地將它轉換爲可映射像這樣(未經):

if let MappableType = T.self as? Mappable.self { 
    return MappableType(Json : [:]) 
} 

通常變量名是小寫的,但在這種情況下,我能想象用大寫,因爲它被用作一個類型。

根據您的使用情況/調用網站,您也可以採取不同的方式。

如何制約getInstance<T>() -> T方法:

getInstance<T: Mappable>() -> T