【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;//定时 ...
随机推荐
- 【THUWC 2017】在美妙的数学王国中畅游
数学王国里有n座城市,每座城市有三个参数\(f\),\(a\),\(b\),一个智商为\(x\)的人经过一座城市的获益\(f(x)\)是 若\(f=1\),则\(f(x)=\sin(ax+b)\): ...
- gulp+babel面向未来变成
1.需要本地安装node; 2.安装gulp: 3.在项目根目录启动node; 安装babel组件: npm install --save-dev babel-core npm install --s ...
- css系统学习网站
最近系统学习一下css样式,找到一个不错的网站.http://css.doyoe.com/
- 关于Android 7.0无法进行https抓包的问题
在App进行数据请求的时候,如果每次都打印log去判断是一件很不"人性化"的操作行为,所以一般都会进行抓包分析. 以最常用的软件Fiddler来说,进行普通的http抓包没什么事, ...
- 为wampserver 添加新版本php支持
1.1. 停止WAMP服务器. 2.下载要安装的PHP版本.下载Window版本的ZIP包啦:http://windows.php.net.解压到 Wamp的安装目录\bin\php\php7.2. ...
- 关于一道面试题【字符串 '1 + (5 - 2) * 3',怎么算出结果为10,'eval'除外】
最近徘徊在找工作和继续留任的纠结之中,在朋友的怂恿下去参加了一次面试,最后一道题目是: 写一个函数,输入一个字符串的运算式,返回计算之后的结果.例如这样的: '1 + (5 - 2) * 3',计算出 ...
- Problem : 1013 ( Digital Roots )
tips:分析不够仔细,白费了许多功夫.输入数据的范围,平时几乎很少考虑的,这个以后得注意.代码检查不够仔细啊,以后得注意了 #include<iostream> using namesp ...
- 邮箱&&密码验证-原理
原理版: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF- ...
- Spring源码学习:第1步--在Spring源码中添加最简单的Demo代码
为了最大程度地贴近Spring源码并进行学习,一种比较直接的做法是:直接在Spring源码中加入Demo代码,并进行调试. 参照以前使用Spring的经验,Spring最简单的使用方法是:一个实体类. ...
- QC的使用简介
目录一.站点管理员的操作(后台)1.登录2.创建域3.创建项目4.新建用户5.QC的一些其他信息的修改(非 常用)二.项目管理员对项目的配置管理(前台)1.登录2.修改用户个人信息及密码3.项目成员设 ...
