【问题标题】:Converting a string to a class in Swift在 Swift 中将字符串转换为类
【发布时间】:2016-02-25 20:02:13
【问题描述】:

我正在使用 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&lt;classType&gt;.map(json.rawString()) 行时,它会给我一个编译器错误:

classType 不是类型

上面的代码有什么问题

【问题讨论】:

  • 您为什么认为这段代码有问题?你期望会发生什么?实际发生了什么?
  • 抱歉,添加了更多细节
  • 什么是 entityType ?
  • 致命错误的原因是 NSClassFromString(entityType) 返回 nil。第二个(编译器)错误的原因是 AnyObject 是协议。要查看他的类型,请使用 AnyObject.self,它会为您提供 AnyObject.Protocol。
  • @Roee84 在本例中,entityType 是 Student。项目名称是大学

标签: swift objectmapper


【解决方案1】:

你得到了错误:

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

因为 NSClassFromString 失败并返回 nil,然后您将其解包,从而导致错误。

我猜entityType 包含一个类似于myClass 的类名。 Swift 现在使用命名空间,因此要从字符串创建类,字符串必须包含 AppName.myClass

您可以硬编码您的应用名称,也可以使用以下代码来获取它:

    NSBundle.mainBundle().infoDictionary!["CFBundleName"] as! String

您的代码也存在其他问题。当 NSClassFromString 成功时,它会创建一个类的实例。这不能转换为类型。此外,您不能在Mapper&lt;classType&gt; 中将变量作为泛型传递,因为 Swift 需要在编译时知道类类型。相反,您可以更改 Mapper 类以将类型作为参数。例如:

    Mapper.map(classInstance.dynamicType, json.rawString())

虽然现在我重新阅读了您的问题,但您正在使用 Mapper 库,因此可能不愿意更改它。

查看 ObjectMapper 的文档,它需要您创建一个 Mapper 实例 - 即。而不是Mapper&lt;MyClass&gt;.map,你需要Mapper&lt;MyClass&gt;().map

【讨论】:

  • 我尝试对其进行硬编码(用于测试目的)let classType : AnyObject.Type = NSClassFromString("University.Student")! as AnyObject.Type print (classType),但是当我尝试打印出类类型时,它给了我classType = &lt;Unable to determine byte size.&gt;
  • 我得到了第一部分的工作,即我有一个有效的 classType
  • 该类是 Object 的子类(因为我使用的是 RealmSwift),所以我无法使用 classType.type
  • 糟糕,应该是dynamicType
  • 我收到一条错误消息:`参数标签 (:,:) 与可用的重载不匹配
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-13
  • 2018-09-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多