我正在使用Alamofire发出GET请求,并使用ObjectMapper库将响应转换为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变量可以是众多类型中的一种,即User,Student,Teacher,Staff等。我试图动态创建类类型并基于此创建模型。
然而,它在行let classType : AnyObject.Type = NSClassFromString(entityType)! as AnyObject.Type
上崩溃,并显示错误消息:
致命错误:在解包可选值时意外发现nil
当我取消注释行let model = Mapper<classType>.map(json.rawString())
时,它会给我一个编译错误:
classType不是类型
上述代码有什么问题
答案 0 :(得分:0)
您收到错误:
致命错误:在解包可选值时意外发现nil
因为NSClassFromString失败并返回nil,然后你将解包,从而导致错误。
我猜测entityType
包含myClass
行的类名。 Swift现在使用名称空间,因此要从字符串创建类,该字符串必须包含AppName.myClass
。
您可以硬编码您的应用名称,也可以使用以下代码来获取它:
NSBundle.mainBundle().infoDictionary!["CFBundleName"] as! String
您的代码也存在其他问题。当NSClassFromString成功时,它将创建该类的实例。这不能转换为类型。此外,您无法在Mapper<classType>
中将变量作为泛型传递,因为Swift需要在编译时知道类类型。相反,您可以更改Mapper类以将类型作为参数。例如:
Mapper.map(classInstance.dynamicType, json.rawString())
虽然现在我重新阅读了您的问题,但您正在使用Mapper的库,因此可能不愿意更改它。
看着ObjectMapper的doco,它需要你创建一个Mapper实例 - 即。而不是Mapper<MyClass>.map
,您需要Mapper<MyClass>().map
。