我有以下类
class BannerResponse : NSObject{
let URL = "Url";
let CONTACT_NO = "ContactNo";
let IMAGE = "Image";
let BIG_IMAGE = "BigImage";
let ID = "Id";
let TITLE = "Title";
let NO_VIEW = "NoView";
let START_DATE = "StartDate";
let END_DATE = "EndDate";
var url:String;
var contactNo:String;
var image:String;
var bigImage:String;
var title:String;
var id:Int;
var noView:Int;
var startDate:String;
var endDate:String;
init(data : NSDictionary){
url = data[URL] as! String;
contactNo = data[CONTACT_NO] as! String;
image = data[IMAGE] as! String;
bigImage = data[BIG_IMAGE] as! String;
title = data[TITLE] as! String;
id = data[ID] as! Int;
noView = data[NO_VIEW] as! Int;
startDate = data[START_DATE] as! String;
endDate = data[END_DATE] as! String;
}
}
当我运行代码时,我得到了以下错误
Could not cast value of type 'NSNull' (0x10a85f378) to 'NSString' (0x109eccb20).
编辑
do {
if let json = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers) as? NSDictionary{
onSuccess(BannerResponse(data: json))
}
} catch {
onFail()
}
您的一个data[SOME_KEY]
的类型是NSNull
而不是String
,因为您使用!
强制转换为String
,所以应用程序崩溃。
你可以做两件事之一:
- 将BannerResponse类上的变量更改为可选变量。在
init
方法中设置值时,请使用?
而不是!
。像这样:
`
var title: String?
init(data: NSDictionary)
{
self.title = data[TITLE] as? String
}
或
- 在
init
方法中设置值时,请使用?
而不是!
,但当dict[SOME_KEY]
为零或不是预期类型时,请设置默认值。这看起来像这样:
`
if let title = data[TITLE] as? String
{
self.title = title
}
else
{
self.title = "default title"
}
// Shorthand would be:
// self.title = data[TITLE] as? String ?? "default title"
我想第三件事是确保服务器永远不会发送空值。但这是不切实际的,因为根本不存在"从不"这回事。您应该编写客户端代码,假设JSON中的每个值都可以是null或意外类型。
您的某些键的值为null。它们通过NSJSONSerialization映射到NSNull。
你需要做几件事
将所有变量(url
、contactNo
等)更改为选项:
var url:String?
var contactNo:String?
将所有作业更改为使用?
而不是!
:
url = noNulls[URL] as? String
contactNo = noNulls[CONTACT_NO] as? String
最后,让代码处理所有变量的零值。(但不要使用!
。该路径会导致崩溃。)