记录下这个知识点:

一般我们在一下两种情况会遇到 ? 和 !的使用

1,声明变量时

var number:Int?
var str:String?

2,在对变量进行操作时

number?.hasValue
str!.hasValue

下面就上面两种情况,简单解释下:

a,声明变量时,如果不手动初始化,Swift是不会自动初始化该变量为一个默认值的,

如果不加?,在进入该页面的时候,会报错,错误提示就是有为初始化的变量,大家可以自己测验下

例如:

var a: String 

var b = a                             // error :因为没有初始化a,a没有值

但是对于Optional的变量则不同,Optional的变量在声明时如果不初始化,Swift会自动将该变量初始化为nil。声明变量时在类型后添加?或者!,就是告诉编译器这是一个Optional的变量。

加上?,例如:

var a: String?                                   // a 为nil

var b: String?                                   // b 为nil

var a_test = a                                  // a_test 为nil

var b_test = b                                  // b_test 为nil

简而言之就是加上 ? 就是变量初始化的时候自动nil,如果不加,Swift自动视为没有初始化,报错

Optional事实上是一个枚举类型,从下图可以看出,Optional包含None和Some两种类型,而nil就是Optional.None,非nil就是Optional.Some。如果Optional变量在声明时不初始化,Swift会调用init()来初始化变量为nil,而用非nil的值初始化变量时,会通过Some(T)把该原始值包装,所以在之后使用的时候我们需要通过解包取出原始值才能使用。

b,对变量进行操作时

var arrayCount = dataList?.count

这时问号的意思类似于isResponseToSelector,即如果变量是nil,则不能响应后面的方法,所以会直接返回nil。如果变量非nil,就会拆Some(T)的包,取出原始值执行后面的操作。

var arrayCount = dataList!.count

这里的叹号和之前的问号则不同,这里表示我确定dataList一定是非nil的,所以直接拆包取出原始值进行处理。因此此处如果不小心让dataList为nil,程序就会crash掉。

回到上面声明时?和!区别的问题上去
声明变量时的?只是单纯的告诉Swift这是Optional的,如果没有初始化就默认为nil,而通过!声明,则之后对该变量操作的时候都会隐式的在操作前添加一个!。

可选类型说明:

可选类型是swift一个特色,它表示一个变量有可能有值,也可能没有值(nil)

声明方式是“数据类型+问号”

而当腰使用一个可选类型的变量时,要在后面加感叹号!;

总结

  1. 问号?
    a.声明时添加?,告诉编译器这个是Optional的,如果声明时没有手动初始化,就自动初始化为nil
    b.在对变量值操作前添加?,判断如果变量时nil,则不响应后面的方法。
  2. 叹号!
    a.声明时添加!,告诉编译器这个是Optional的,并且之后对该变量操作的时候,都隐式的在操作前添加!
    b.在对变量操作前添加!,表示默认为非nil,直接解包进行处理

swift开发之 -- ? 和 ! 的作用的更多相关文章

  1. Swift开发语法

    Swift开发入门 简介 Swift 语言由苹果公司在 2014 年推出,用来撰写 OS X 和 iOS 应用程序 2014 年,在 Apple WWDC 发布 历史 2010 年 7 月,苹果开发者 ...

  2. Swift 开发语法

    文/Tuberose(简书作者)原文链接:http://www.jianshu.com/p/5e2d4c34f18e著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”. 简介 Swift 语 ...

  3. swift开发新项目总结

    新项目用swift3.0开发,现在基本一个月,来总结一下遇到的问题及解决方案   1,在确定新项目用swift后,第一个考虑的问题是用纯swift呢?还是用swift跟OC混编      考虑到新项目 ...

  4. swift开发多线程篇 - 多线程基础

    swift开发多线程篇 - 多线程基础 iOS 的三种多线程技术 (1)NSThread  使用NSThread对象建立一个线程非常方便 但是!要使用NSThread管理多个线程非常困难,不推荐使用 ...

  5. Swift开发第十篇——可变参数函数&初始化方法顺序

    本篇分为两部分: 一.Swift中的可变参数函数 二.初始化方法的顺序 一.Swift中的可变参数函数 可变参数函数指的是可以接受任意多个参数的函数,在 OC 中,拼接字符串的函数就属于可变参数函数 ...

  6. Cordova - 与iOS原生代码交互2(使用Swift开发Cordova的自定义插件)

    在前一篇文章中我介绍了如何通过 js 与原生代码进行交互(Cordova - 与iOS原生代码交互1(通过JS调用Swift方法)),当时是直接对Cordova生成的iOS工程项目进行编辑操作的(添加 ...

  7. 《Swift开发指南》

    <Swift开发指南> 基本信息 作者: 关东升    赵志荣 丛书名: 图灵原创 出版社:人民邮电出版社 ISBN:9787115366245 上架时间:2014-8-5 出版日期:20 ...

  8. Swift开发中的一些琐碎

    1.Swift中使用OC 1.创建 pch 文件,直接引用需要的头文件  #import"SQLite3.h" 2.修改 pct 路径 ,如下图,就可以使用了 2. Swift 没 ...

  9. 智捷公开课马上开始了-欢迎大家一起讨论学习-第一系列读《Swift开发指南(修订版) 》看Swift视频教程

    引用: 智捷课堂携手51CTO学院.图灵教育联合举办iOS线上培训就业班系列体验公开课. 分享移动开发.移动设计方向最新,最热,最抢眼技术热点以及设计经验.我们每周将最少举办一次公开课,同时会提前安排 ...

  10. 关于《Swift开发指南》背后的那些事

    时间轴(倒叙)2014年8月底在图灵出版社的大力支持下,全球第一本全面.系统.科学的,包含本人多年经验的呕心沥血之作<Swift开发指南>(配有同步视频课程和同步练习)全线重磅推出2014 ...

随机推荐

  1. mvn项目中的pom文件提示Error parsing lifecycle processing instructions解决

    清空.m2/repository下的所有依赖文件,重新下载即可解决该问题. 如果本地用户下没有.m2/repository 目录,找到如下mvn 指定的repository,进去之后清空所有文件.

  2. LeetCode: solveSudoku 解题报告

    Sudoku SolverWrite a program to solve a Sudoku puzzle by filling the empty cells. Empty cells are in ...

  3. Ubuntu设置root密码

    最初使用系统时,只有当前管理员的密码,root密码为随机生成的. 通过 sudo passwd 设置root密码,然后su获得root,也就是最高权限

  4. VS2008 express + opencv配置

    刚开始接触opencv,不是很熟悉,配置过程主要参考了这篇博客,大家可以去看看 http://www.cnblogs.com/micky-zhou/archive/2012/08/06/2624433 ...

  5. contiki bsp

    1 lpc1768  git clone https://github.com/bolandi/contiki.git 2 efm32    git clone https://github.com/ ...

  6. ad9 的快捷方式

    TAB:选中元件后,可以显示该元件的属性: PAGEUP:以鼠标所在点为中心,放大视图: PAGEDOWN:以鼠标所在点为中心,缩小视图: HOME:居中,可以从原来光标下的图纸位置,移位到工作区中心 ...

  7. 机器学习:K-Means聚类算法

    本文来自同步博客. 前面几篇文章介绍了回归或分类的几个算法,它们的共同点是训练数据包含了输出结果,要求算法能够通过训练数据掌握规律,用于预测新输入数据的输出值.因此,回归算法或分类算法被称之为监督学习 ...

  8. Python3分别将list、numpy数组内容写入txt文件中

    1.python保存numpy数据: numpy.savetxt("result.txt", numpy_data) 2.保存list数据: file=open('data.txt ...

  9. 【Qt Tips】QLineEdit内容过滤之setValidator和setInputMask浅析

    1.QValidator分析 2.InputMask格式 3.测试代码和用例 项目路径: GitHub: https://github.com/Qunero/NeoQtTestDemo/tree/ma ...

  10. wysiwyg+ckeditor 安装

    1.下载wysiwyg模块  https://drupal.org/project/wysiwyg 2.下载ckeditor 上传/sites/all/libraries 出现问题: 解决方法: 在文 ...