1

我正在使用 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 变量可以是多种类型之一,即用户、学生、教师、员工等。我正在尝试动态创建一个类类型并基于它创建模型。

但是它在let classType : AnyObject.Type = NSClassFromString(entityType)! as AnyObject.Type给出错误消息的行上崩溃:

致命错误:在展开可选值时意外发现 nil

此外,当我取消注释该行时let model = Mapper<classType>.map(json.rawString()),它会给我一个编译器错误:

classType 不是类型

上面的代码有什么问题

4

1 回答 1

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 的文档,它需要您创建一个 Mapper 实例 - 即。而不是Mapper<MyClass>.map你需要Mapper<MyClass>().map.

于 2016-02-25T22:10:50.587 回答