这一部分,主要讲Swift中创新的可选型(optionals)

一、概要

可选型是Swift创新的一种新的类型,首先看一下可选型的应用场景:

var errorCode : Int = 404

这时候errorCode的值是404,表示此时的错误状态码是404,当产生一种错误的时候就会获得其对应的errorCode,

但是如果没有错误那应该怎么办呢?

在C/C++和Java中我们会给errorCode赋值为0或者是null(其实null也就是0),但是我们怎么能够保证0不是一种错误的状态码呢?

Swift为了解决这一问题,提供了可选型(optionals)当这个值不存在的时候,我们用nil表示,

需要注意的是:

var errorCode : Int = 404

errorCode = nil

这是错误的,因为nil是一种特殊的类型,是不可以赋值给int型的变量的。

正确的操作是:

var errorCode : Int? = 404

errorCode = nil

添加一个?就对了,这时候Int?表示的是整型的可选型

需要注意的是,可选型不可以赋值给不可选型的变量。

二、可选型的解包

在使用可选型的时候,需要进行解包操作,有两种解包(unwrap)方式:

1)强制解包

var errorCode : Int? = 404

print(“The errorCode is”+errorCode!)

这种解包方式需要开发者保证errorCode的值不是nil,否则就会报错。

2)if-let解包

var errorCode : Int? = 404

if let errorCode = errorCode {

  print(“The errorCode is”+errorCode)  

}

建议采用这种方式,当出现多个量需要解包的时候:

if let errorCode = errorCode,

   errorMessage = errorMessage{

}

三、optional Chaining

先看看应用环境:

var errorMessage : String? = “Not Found”

if let errorMessage = errorMessage{

  errorMessage.uppercaseString

}

这种方式是错的,因为errorMessage是String而不是String?

如果要使用String的uppercaseString方法的话可以这样做:

errorMessage?.uppercaseString

或者

errorMessage!.uppercaseString(确定不是nil)

这里的返回类型也是一个可选型

如果errorMessage!.uppercaseString返回,再进行操作就类似一条chain。

四、nil coalesce

我们建议在声明变量的时候就给变量赋初值,但有时候,我们希望通过后面的逻辑判断之后再对变量进行赋值

这时候我们可以这样做:

var errorMessage : String? = nil

let message = errorMessage == nil ? “Not Found” : errorMessage

当然可以通过nil coalesce方式

var errorMessage : String? = nil

let message = errorMessage??“Not Found”

五、元组的可选型

var error1 : (errorCode : Int?, errorMessage : String?) = (404, “Not Found”)

其中errorCode和errorMessage是可选型,但是error1不是可选型

因此errorCode和errorMessage可以是nil,而error1不可以

var error1 : (errorCode : Int?, errorMessage : String?)? = (404, “Not Found”)

errorCode和errorMessage,error1就都是可选型了

六、隐式可选型

主要应用在函数的构造函数中

var errorMessage : String! = nil

!进行使用的时候可以不进行解包操作,但是必须确保不为nil

在使用的时候,构造函数可以这样定义,但是在后面会先赋值,再使用。

Swift语言中与C/C++和Java不同的语法(二)的更多相关文章

  1. Swift语言中与C/C++和Java不同的语法(一)

    ---恢复内容开始--- Swift作为苹果官方推出的IOS开发的推荐语言,在过去的几年间受到了越来越广泛的关注,其实编程的人都知道,不同的编程语言大同小异,掌握一门新的语言关键是了解它与其它语言不同 ...

  2. Swift语言中与C/C++和Java不同的语法(五)

    这一节将会提到Swift中其他的关于函数的应用,这些内容包括有: 默认参数值和可变参数值.常量参数.返回函数类型和函数嵌套: 一.默认参数值和可变参数值 对默认参数值是指在函数的声明中就已经定义了参数 ...

  3. Swift语言中与C/C++和Java不同的语法(三)

    这一部分的主要内容是Swift中的Collections 我们知道Java中的Collection基本上是每一个Java程序猿接触到的第一个重要的知识点. 在Swift中也不例外,Swift中的Col ...

  4. Swift语言中与C/C++和Java不同的语法(四)

    这一节,我们将会讨论一下Swift中的函数相关的基本内容 首先是函数的创建: func sayHello (name:String) -> String { return "Hello ...

  5. Go语言中的slice

    Go语言中的slice有点类似于Java中的ArrayList,但在使用上更加灵活,先通过下面一个小例子来体验一下如何通过一个已有的切片来产生一个新切片: func main() { slice := ...

  6. c语言中的scanf在java中应该怎么表达,Scanner类。

    1 java是面向对象的语言 它没有像C语言中的scanf()函数,但是它的类库中有含有scanf功能的函数 2 java.util包下有Scanner类 Scanner类的功能与scanf类似 3 ...

  7. Java 语言中 Enum 类型的使用介绍

    Enum 类型的介绍 枚举类型(Enumerated Type) 很早就出现在编程语言中,它被用来将一组类似的值包含到一种类型当中.而这种枚举类型的名称则会被定义成独一无二的类型描述符,在这一点上和常 ...

  8. 浅谈Java语言中ArrayList和HashSet的区别

    Java语言中ArrayList和HashSet的区别 2019-04-10   13:22:49 一.基本区别 首先一起看个实例,其代码如下: package com.MrZ_baby.com; i ...

  9. 浅谈Java语言中try{}catch{}和finally{}的执行顺序问题

    浅谈Java语言中try{}catch{}和finally{}的执行顺序问题 2019-04-06  PM  13:41:46  1. 不管有没有出现异常,finally块中代码都会执行: 2. 当t ...

随机推荐

  1. 角点检测和匹配——Harris算子

    一.基本概念 角点corner:可以将角点看做两个边缘的交叉处,在两个方向上都有较大的变化.具体可由下图中分辨出来: 兴趣点interest point:兴趣点是图像中能够较鲁棒的检测出来的点,它不仅 ...

  2. Opencv探索之路(十九):读写xml和yml文件

    有时候我们处理完图像后需要保存一下数据到文件上,以供下一步的处理.一个比较广泛的需求场景就是:我们对一幅图像进行特征提取之后,需要把特征点信息保存到文件上,以供后面的机器学习分类操作.那么如果遇到这样 ...

  3. docker学习笔记--重基础使用

    最近一直在研究Elasticsearch,后来部门的同事遇到了一个docker集群的未授权访问漏洞,于是稍微看了一下docker进行了一下基本的入门,本文把自己学习docker的过程进行了一个详细的记 ...

  4. Android系统--输入系统(十七)Dispatcher线程_分发dispatch

    Android系统--输入系统(十七)Dispatcher线程_分发dispatch 1. 回顾 InputRead线程从输入设备当中得到输入事件 对于读到输入事件稍作处理,比如紧急事件,来电时候按下 ...

  5. Bower的入门

    接触Bower一年多了,今天对于它的有一些疑问,并且写此博文记录之. 首先把Bower的官网附上: https://bower.io/ (一)什么是Bower Bower:就是一个前端包管理工具.能够 ...

  6. MySQL学习笔记(三):常用函数

    一:字符串函数 需要注意的几个细节: 1.cancat中有一个字符串为null,则结果为null. 2.left(str,x) 和 right(str,x)中x为null,则不返回任何字符串,不是nu ...

  7. 跨主机网络概述 - 每天5分钟玩转 Docker 容器技术(48)

    前面已经学习了 Docker 的几种网络方案:none.host.bridge 和 joined 容器,它们解决了单个 Docker Host 内容器通信的问题.本章的重点则是讨论跨主机容器间通信的方 ...

  8. Web测试与APP测试有哪些异同?

    1.相同点 不管是传统行业的web测试,还是新兴的手机APP测试,都离不开测试的基础知识,即是不管怎么变,测试的原理依然会融入在这两者当中. 1)设计测试用例时,依然都是依据边界值分析法.等价类划分等 ...

  9. centos7 Mysql备份还原并下载到windos

    数据库备份 1.show databases; #查看一下数据库 2.对应数据库做备份开始: mysqldump -u root -p 需要备份的数据库 >  db.sql     #把它备份到 ...

  10. PHP面向对象中 static:: 与 self:: parent:: $this-> 的区别

    很多好几年工作经验的PHP工程师,对PHP面向对象中 static:: .self::.parent::.$this->  的定义和使用都不清晰,特做详细梳理: static:: 可以访问全局作 ...