Swift 学习之二十一:?和 !(详解)

简介:

新更新的内容请移步阅读:

第二节: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

......暂时只想到这些,任何人都可以继续往下补充!




目录
相关文章
|
7月前
|
人工智能 物联网 API
LLM 大模型学习必知必会系列(十三):基于SWIFT的VLLM推理加速与部署实战
LLM 大模型学习必知必会系列(十三):基于SWIFT的VLLM推理加速与部署实战
LLM 大模型学习必知必会系列(十三):基于SWIFT的VLLM推理加速与部署实战
|
Swift
(一)swift的基本学习
(一)swift的基本学习
181 0
|
开发工具 Swift iOS开发
Swift学习第二练——Swift项目时光电影
Swift学习第二练——Swift项目时光电影
164 0
Swift学习第二练——Swift项目时光电影
|
Swift 开发者 iOS开发
Swift学习第一练——用Swift实现的FlappyBird小游戏
Swift学习第一练——用Swift实现的FlappyBird小游戏
195 0
Swift学习第一练——用Swift实现的FlappyBird小游戏
|
Swift
Swift专题讲解二十一——协议
Swift专题讲解二十一——协议
150 0
|
JavaScript Java iOS开发
1.Swift学习之介绍
简介 Swift 语言由苹果公司在 2014 年推出,用来撰写 Mac OS 和 iOS 应用程序 Apple WWDC 2014 横空出世 Swift 历史 2010 年 7 月,苹果开发者工具部门总监 Chris Lattner...
1183 0
|
Swift C语言
2.Swift学习之初探
Playground是什么? 从Xcode6开始出现(Swift开始出现) 翻译为:操场/游乐场 对于学习Swift基本语法非常方便 所见即所得(快速查看结果) 语法特性发生改变时,可以快速查看 Playground Swift最...
858 0
|
iOS开发
Swift学习第十三枪-使用Swift开发IOS中蓝牙4.0的开发流程
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.
1064 0
|
数据库 iOS开发 数据库管理
Swift学习第十二枪----移动数据库王者Realm入门教程
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010046908/article/details/51636392 今天给大家带来的是堪称是一个可以替代SQLite,Core Data 的以及ORMlibraries的轻量级数据库—Realm移动端数据库。
957 0
|
JSON 数据格式 iOS开发
Swift学习第十枪-AFNetwoking3.0的封装
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010046908/article/details/51588829 下面是我的新建的Swift学习交流群,欢迎大家一起来共同学习Swift。
832 0