swift - 在 Swift 中将字符串转换为类

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

但是它在 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

上面的代码有什么问题

最佳答案

您遇到错误:

fatal error: unexpectedly found nil while unwrapping an Optional value

因为 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 .

关于swift - 在 Swift 中将字符串转换为类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35637172/

相关文章:

ios - 如何在 Swift 中根据外部事件更新变量?

ios - UIView 幻灯片转换、需要的帮助和接近工作的代码

swift - 无法推断通用参数 "T"

ios - 如何以编程方式检查应用程序是否在 TestFlight 测试版模式下运行?

java - 自定义 BigInteger JSON 序列化程序

java - Json 到 Java 对象 - 由于字段相同而失败

ios - 如何让图像出现在 Swift 的 UI PickerView 组件中?

java - Jackson:检查ArrayNode是否包含JsonNode

java - 多态性在三元中失败,但在标准条件中通过(捕获?)

c# - FullAuditedEntity,对象映射器 : CreatorUserId Null when Creating New Entry or Deleting