Swift中字典解析后的问题,!?两种拆包的差别
给出一个json,使用SwiftyJSON解析传给model,传进去是个字典,字典里有String,NSNumber,NSDoctionary,和NSArray。
正常情况下直接使用下面的解析方法即可:
id = dict.objectForKey("id") as! NSNumber
注意,此时是在正常情况下,即“id”对应是有value的,但问题是如果后台出错了,或请求出错了,返回的字典里没有这个字段了,或改名字了,那么这句话会静静的崩掉。
也许你已经注意到了,这句代码中使用了一个符号,就是as后面的“!”,“!”是什么意思呢?个人理解是:强制解包,解包不成功就崩掉。所以使用!要特别小心。
为什么要解包?这源于swift的新特性,类型推断,字典里的值到底是什么类型,swift会进行猜测,如果要接收的对象的类型正好是swift推断的类型,那么就会赋值成功,否则就会提示错误。
与“!”相近的有一个“?”,它也是拆包的,但是不同的是,不是强制拆包,如果拆包失败,就会返回一个nil给接受对象。这样就保证了赋值安全。例如下面判空一个数组:
var item:NSMutableArray?
item = dict["items"]?["items1"] as? NSMutableArray
if item != nil
{
dictionary_selected = dict["items"]!["items1"] as! NSMutableArray
}
else
{
print("empty array!")
}
此时就不会再字段不存在时崩掉了。
Swift中字典解析后的问题,!?两种拆包的差别的更多相关文章
- python中字典的循环遍历的两种方式
开发中经常会用到对于字典.列表等数据的循环遍历,但是python中对于字典的遍历对于很多初学者来讲非常陌生,今天就来讲一下python中字典的循环遍历的两种方式. 注意: python2和python ...
- 在Java Web程序中使用监听器可以通过以下两种方法
之前学习了很多涉及servlet的内容,本小结我们说一下监听器,说起监听器,编过桌面程序和手机App的都不陌生,常见的套路都是拖一个控件,然后给它绑定一个监听器,即可以对该对象的事件进行监听以便发生响 ...
- Eclipse中SVN的安装步骤(两种)和使用方法
Eclipse中SVN的安装步骤(两种)和使用方法 一.给Eclipse安装SVN,最常见的有两种方式:手动方式和使用安装向导方式.具体步骤如下: 方式一:手动安装 1.下载最新的Eclipse,我的 ...
- [转]MFC子线程中更新控件内容的两种办法
一.概述 每个系统中都有线程(至少都有一个主线程),而线程最重要的作用就是并行处理,提高软件的并发率.针对界面来说,还能提高界面的响应能力.一般的,为了应用的稳定性,在数据处理等耗时操作会单独在一个线 ...
- js如何实现动态的在表格中添加和删除行?(两种方法)
js如何实现动态的在表格中添加和删除行?(两种方法) 一.总结 1.table元素有属性和一些方法(js使用) 方法一:添加可通过在table的innerHTML属性中添加tr和td来实现 tab.i ...
- Java构造和解析Json数据的两种方法详解二
在www.json.org上公布了很多JAVA下的json构造和解析工具,其中org.json和json-lib比较简单,两者使用上差不多但还是有些区别.下面接着介绍用org.json构造和解析Jso ...
- Java 获取*.properties配置文件中的内容 ,常见的两种方法
import java.io.InputStream; import java.util.Enumeration; import java.util.List; import java.util.Pr ...
- Java构造和解析Json数据的两种方法详解二——org.json
转自:http://www.cnblogs.com/lanxuezaipiao/archive/2013/05/24/3096437.html 在www.json.org上公布了很多JAVA下的jso ...
- Java构造和解析Json数据的两种方法详解一——json-lib
转自:http://www.cnblogs.com/lanxuezaipiao/archive/2013/05/23/3096001.html 在www.json.org上公布了很多JAVA下的jso ...
随机推荐
- Python导入不同文件夹下模块
import os.path as osp import sys def add_path(path): if path not in sys.path: sys.path.insert(0, pat ...
- Mybatis学习手记(一)
年近不惑,为生活所迫,重新开始学习JAVA,计划将公司的开发平台统一到JAVA上来.现公司的技术杂乱,有PB开发的程序要维护.有PYTHON的程序要维护,有.NET的,也有JAVA的,非常不容易形成合 ...
- load data导入数据之csv的用法
今天总结一下:csv格式文件导入的方法. 1.准备数据表:CSV
- 光圈与F数相关知识
一.F数 F数.光圈数.相对孔径的倒数. F数代表的意义 F数小(光圈大).F数大(光圈小). F数又称为镜头速度,F数小的镜头速度快.因为拍摄的曝光时间△t 正比于F数的平方. F数还能表征镜头的分 ...
- A guide to analyzing Python performance
来源:http://www.huyng.com/posts/python-performance-analysis/ While it's not always the case that every ...
- poj1840
Eqs Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 15133 Accepted: 7426 Description ...
- Highway
Highway Accepted : 78 Submit : 275 Time Limit : 4000 MS Memory Limit : 65536 KB Highway In ICPCC ...
- JS将秒转换为 天
function SecondToDate(msd) { var time =msd if (null != time && " ...
- CSS Float浮动所带来的奇怪现象
先抛个例子出来 运行下面的例子后,可以看到输出内容如下. <!DOCTYPE html> <html lang="en"> <head> < ...
- JS HTML DOM 事件对象(onclick、onmouseenter)
HTML DOM 事件允许Javascript在HTML文档元素中注册不同事件处理程序. 事件通常与函数结合使用,函数不会在事件发生前被执行! (如用户点击按钮). HTML DOM 事件 DOM: ...