2016-02-25 18 views
1

我使用Alamofire來創建GET請求,並使用ObjectMapper庫將響應轉換爲Swift中自己的類。將字符串轉換爲Swift中的類

Alamofire.request(self.REST_METHOD!, self.REQUEST_URL, headers : ["Authentication_Token" : authToken]).responseJSON { response in 


    if response.response != nil && response.response?.statusCode == 200 { 

     let json = JSON((response.result.value as? NSDictionary)!) 
     let classType : AnyObject.Type = NSClassFromString(entityType)! as AnyObject.Type     
     //let model = Mapper<classType>.map(json.rawString()) 


    } 
} 

的的EntityType變量可以是多種類型,即用戶,學生,教師和工作人員,等我想動態創建一個類類型,並基於該模型之一。

但是它崩潰上給出錯誤信息行let classType : AnyObject.Type = NSClassFromString(entityType)! as AnyObject.Type

fatal error: unexpectedly found nil while unwrapping an Optional value

此外,當我取消對該行let model = Mapper<classType>.map(json.rawString()),它給了我一個編譯器錯誤:

classType is not a type

什麼是錯的以上代碼

+1

爲什麼你認爲這段代碼有問題?你期望發生什麼?究竟發生了什麼? –

+0

對不起,添加更多詳情 –

+0

什麼是entityType? – Roee84

回答

0

您收到的錯誤:

fatal error: unexpectedly found nil while unwrapping an Optional value

因爲NSClassFromString失敗並返回nil,然後解包,從而導致錯誤。

我猜entityType包含沿myClass行的類名稱。 Swift現在使用命名空間,所以要從一個字符串創建一個類,該字符串必須包含AppName.myClass

你可以手動編碼的程序名稱,或者使用下面的代碼獲得它:

NSBundle.mainBundle().infoDictionary!["CFBundleName"] as! String 

還有其他的問題,你的代碼了。當NSClassFromString成功時,它將創建該類的一個實例。這不能轉換爲類型。另外,由於Swift在編譯時需要知道類的類型,因此不能在Mapper<classType>中將變量作爲通用變量傳遞。相反,您可以更改Mapper類以將該類型作爲參數。例如:

Mapper.map(classInstance.dynamicType, json.rawString()) 

雖然現在我重讀你的問題,您使用的是映射庫,並因此可能不願意改變它。

看着ObjectMapper的doco,它需要你創建一個Mapper實例 - 即。而不是Mapper<MyClass>.map您需要Mapper<MyClass>().map

+0

我嘗試了對它進行硬編碼(用於測試目的)'let classType:AnyObject.Type = NSClassFromString(「University.Student」)!作爲AnyObject.Type print(classType)'',但是當我嘗試打印出類的類型時,它給了我'classType = <無法確定字節的大小。>' –

+0

我得到了第一部分的工作,即我有一個有效的類型 –

+0

這個類是Object的一個子類(因爲我使用RealmSwift),所以我不能使用classType.type –