我正在使用 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/