【iOS】Swift ?和 !(详解)
Swift语言使用var定义变量,但和别的语言不同,Swift里不会自动给变量赋初始值,
也就是说变量不会有默认值,所以要求使用变量之前必须要对其初始化
。如果在使用变量之前不进行初始化就会报错:
- var stringValue : String
- //error: variable 'stringValue' used before being initialized
- //let hashValue = stringValue.hashValue
- // ^
- let hashValue = stringValue.hashValue
出错的原因就是在使用stringValue这个变量之前,没有初始化这个变量,也就是这个变量根本就没有得到内存,
这时就会出错。
那么我们可以使用optional类型,后面跟一个?就是了。
- // 这就是optional, strValue自动得到默认值:nil
- // 这个nil跟Objective-C中的nil不同,不是指针,而是表示值不存在。
- var strValue: String?
- // 判断optional是否有值
- if strValue {
- // do what you need to do here
- }
文档中有提到说,在使用Optional值的时候需要在具体的操作,比如调用方法、属性、下标索引等前面需要加上一个?,如果是nil值(不存在值),也就是Optional.None,会跳过后面的操作不执行,如果有值,就是Optional.Some可能就会拆包(unwrap),然后对拆包后的值执行后面的操作,来保证执行这个操作的安全性,比如Optional
binding:
- // optional binding
- // 如果strValue == nil, 那么结果就是nil,不会调用String的hasValue
- // 如果strValue != nil, 就返回strValue对应的hashValue值并赋值给常量hashValue
- if let hashValue = strValue?.hashValue {
- // do something if neccessary
- }
在写协议(protocol)时,对于可选代理方法,也需要在调用时在函数名后跟着?,如:
- // @objc 是用于处理Swift与OC之间的转换的,由于@optional是OC中的关键字,
- // 所以在protocol之前需要添加上@objc。
- @objc protocol HttpRequestDelegate {
- // @optional 说明这个代理方法是可选方法,
- // 那么在调用的时候,需要这样调用:delegate?.requestFinished?(self, downloadData)
- // 其中delegate?是因为delegate也是optional的
- @optional func requestFinished(request: HttpRequest!, downloadData: NSMutableData!)
- // other funcs ...
- }
- var delegate: HttpRequestDelegate?
- var downloadData = NSMutableData()
- delegate.requestFinished(self, downloadData)
当然我们也可以使用!来强制拆包,这是我们在保证有值的情况下才会这么用:
- var strValue: String?
- strValue = "1234"
- let integer = strValue!.toInt()
- // 更安全的写法是
- if strValue {
- let integer = strValue!.toInt()
- }
隐式强拆包类型:
使用!来声明变量,会成为隐式强拆包可选类型,这表示这个类型永远不会出现nil的情况,但一旦出来,
在调用时就会崩溃。
- // Implicitly Unwrapped Optionals
- // 使用这种方式声明的话,在调用时不需要使用?或!来说明。
- var myLabel: UILabel!
- myLabel = UILabel(frame: CGRectMake(10, 100, 300, 10))
- myLabel.text = "label"
总结:
通常在什么情况下才会使用optional类型呢?
(1)当我们需要声明这样一个变量,变量在设计初始化函数中没有进行初始化时,就需要声明这个变量为optional类型。因为变量在使用前必须先
声明,并且在设计初始化函数中进行初始化。比如我们在viewDidLoad函数中才进行初始化的控件(类成员),就需要声明为optional且必须是var声明,
因为let声明的常量只能是在初始化函数中进行初始化。
(2)当我们不知道是否会有值的时候,这个变量可以声明为optional,比如代理,我们并没有要求必须传代理过来,那么就需要声明为optional。
(3)作为函数参数时,如果这个参数可以没有值,那么就使用optional类型,比如传代理的时候,通常就是可选的,可以设置为nil
......暂时只想到这些,任何人都可以继续往下补充!
【iOS】Swift ?和 !(详解)的更多相关文章
- iOS开发-Runtime详解
iOS开发-Runtime详解 简介 Runtime 又叫运行时,是一套底层的 C 语言 API,其为 iOS 内部的核心之一,我们平时编写的 OC 代码,底层都是基于它来实现的.比如: [recei ...
- 转载]IOS LBS功能详解[0](获取经纬度)[1](获取当前地理位置文本 )
原文地址:IOS LBS功能详解[0](获取经纬度)[1](获取当前地理位置文本作者:佐佐木小次郎 因为最近项目上要用有关LBS的功能.于是我便做一下预研. 一般说来LBS功能一般分为两块:一块是地理 ...
- iOS中-Qutarz2D详解及使用
在iOS中Qutarz2D 详解及使用 (一)初识 介绍 Quartz 2D是二维绘图引擎. 能完成的工作有: 绘制图形 : 线条\三角形\矩形\圆\弧等 绘制文字 绘制\生成图片(图像) 读取\生成 ...
- iOS 2D绘图详解(Quartz 2D)之路径(点,直线,虚线,曲线,圆弧,椭圆,矩形)
前言:一个路径可以包含由一个或者多个shape以及子路径subpath,quartz提供了很多方便的shape可以直接调用.例如:point,line,Arc(圆弧),Curves(曲线),Ellip ...
- iOS开发——Block详解
iOS开发--Block详解 1. Block是什么 代码块 匿名函数 闭包--能够读取其他函数内部变量的函数 函数变量 实现基于指针和函数指针 实现回调的机制 Block是一个非常有特色的语法,它可 ...
- iOS开发:详解Objective-C runTime
Objective-C总Runtime的那点事儿(一)消息机制 最近在找工作,Objective-C中的Runtime是经常被问到的一个问题,几乎是面试大公司必问的一个问题.当然还有一些其他问题也几乎 ...
- iOS应用开发详解
<iOS应用开发详解> 基本信息 作者: 郭宏志 出版社:电子工业出版社 ISBN:9787121207075 上架时间:2013-6-28 出版日期:2013 年7月 开本:16开 ...
- 了解iOS消息推送一文就够:史上最全iOS Push技术详解
本文作者:陈裕发, 腾讯系统测试工程师,由腾讯WeTest整理发表. 1.引言 开发iOS系统中的Push推送,通常有以下3种情况: 1)在线Push:比如QQ.微信等IM界面处于前台时,聊天消息和指 ...
- iOS开发者证书-详解
iOS开发者证书-详解/生成/使用 本文假设你已经有一些基本的Xcode开发经验, 并注册了iOS开发者账号. 相关基础 加密算法 现代密码学中, 主要有两种加密算法: 对称密钥加密 和 公开密钥加密 ...
- iOS NSTimer使用详解 开启、关闭、移除
定时器定时器详解ios定时器关闭定时器NSTimer 一,要使用一个定时器首先要定义一个定时器: @property (strong, nonatomic) NSTimer *myTimer;//定时 ...
随机推荐
- java线程安全问题以及使用synchronized解决线程安全问题的几种方式
一.线程安全问题 1.产生原因 我们使用java多线程的时候,最让我们头疼的莫过于多线程引起的线程安全问题,那么线程安全问题到底是如何产生的呢?究其本质,是因为多条线程操作同一数据的过程中,破坏了数据 ...
- postgresql搭建从库
postgresql搭建从库 master 10.40.196.27 slave 10.40.55.69 需求:master和slave作为主从流复制,当master宕机后,slave切换为新主 ...
- 洛谷 P1564 膜拜
题目出处 s[i]表示前i个人对神牛的膜拜情况,如果膜拜神牛甲则s[i]=s[i-1]+1否则s[i]=s[i-1]-1.那么如果|s[i]-s[j]|<=m或者=i-j+1(也就是人数差不超过 ...
- Appserv(Apache) 设置网页不显示目录(索引)
首先在appserv安装目录下找到httpd.conf文件 ./AppServ/Apache24/conf/httpd.conf 打开文件,找到 Options Indexes FollowSymLi ...
- [转] SDP协议
[转] SDP协议 http://blog.csdn.net/dxpqxb/article/details/18706471 1.SDP协议概述 SDP(Session Description Pro ...
- google提示恶意软件解决办法
对于没有安全经验的小白来说 google的一张图可能就会让吓得不轻(我会说我就是小白么~~) 就是这么一张图~ 其实解决办法很简单 google会向用户推荐几款比较不错的软件 进行检测 其中我认为比较 ...
- 使用git提交到github,每次都要输入用户名和密码的解决方法
使用git提交文件到github,每次都要输入用户名和密码,操作起来很麻烦,以下方法可解决,记录以下. 原因:在clone 项目的时候,使用了 https方式,而不是ssh方式. 默认clone 方式 ...
- Linux系统命令归纳
常规操作命令: # netstat -atunpl |egrep "mysql|nginx"# vimdiff php.ini*# runlevel# rpm -e httpd - ...
- 微软Skype Linux客户端全新发布
前两天,微软说要给“Linux 用户带来一个令人兴奋的新闻”,今天,这个新闻来了.它刚刚为 Linux 发布了一个新的 Skype 客户端. 此次发布,微软为 Linux 带来的 Skype 客户端与 ...
- 第八届蓝桥杯B组java第四题
标题:取数位 求1个整数的第k位数字有很多种方法.以下的方法就是一种.对于题目中的测试数据,应该打印5.请仔细分析源码,并补充划线部分所缺少的代码.注意:只提交缺失的代码,不要填写任何已有内容或说明性 ...
