2016-02-25 48 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 –