在Swift中将字符串转换为类

时间:2016-02-25 20:02:13

标签: swift objectmapper

我正在使用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不是类型

上述代码有什么问题

1 个答案:

答案 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