这一部分,主要讲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. MySql单表最大8000W+ 之数据库遇瓶颈记

    前言 昨晚救火到两三点,早上七点多醒来,朦胧中醒来发现电脑还开着,赶紧爬起来看昨晚执行的SQL命令结果.由于昨晚升级了阿里云的RDS,等了将近两个小时 还在 升降级中,早上阿里云那边回复升级过程中出现 ...

  2. Python运维开发基础-概述-简介

    Python基础知识分为以下几块 1.Python概述 2.基础语法 3.数据结构 4.Python进阶 5.实训案例 一.Python概述 1.Python简介 2.Hello World 3.搭建 ...

  3. select默认选中项颜色为灰色,选择后变为黑色(js实现)

    <script> var unSelected = "#999"; var selected = "#333"; $(function () { $ ...

  4. VUE 分页组件

    <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>& ...

  5. Spring MVC 以.html为后缀名访问获取数据,报406 Not Acceptable错误。

    如题,最近以spring mvc作为后台框架,前端异步获取数据时(.html为后缀名的访问方式),报406 Not Acceptable错误.当初都不知道啥原因,前后台都没报错就是返回不了数据,于是查 ...

  6. OI内的排列与组合(简单版)

    §1基本原理 △让我们来看下面问题: 从甲地到乙地,可以乘火车,也可以乘汽车,还可以乘轮船.一天中,火车有4班,汽车有2班,轮船有3班.那么,一天中乘坐这些交通工具从甲地到乙地共有多少种不同走法?△分 ...

  7. 操作系统,银行家算法模拟实现(Windows 环境 C++)

    计算机操作系统课设需要,写了两个下午的银行家算法(陷在bug里出不来耽误了很多时间),参考计算机操作系统(汤子瀛) 实现过程中不涉及难度较大的算法,仅根据银行家算法的思想和步骤进行实现.以下为详细步骤 ...

  8. 在 Linux 命令行脚本中执行 sudo 时自动输入密码

    使用 expect 实现自动登录的脚本的原理. 脚本代码如下: ############################################## #!/usr/bin/expect set ...

  9. Maven在导入其他项目时报错:Plugin execution not covered by lifecycle configuration

    这几天想把Spring 攻略第二版完整的学习下,所以就在网上下载了该教材的源码,寻思边看书边练习!之前有过一些Maven开发的相关经验,觉得Maven在引入jar包上的配置还是很方便的,所以这次源码的 ...

  10. Epii.js 一个极其简单的Js模板引擎

    Epii.js 简约而不简单的Js模板引擎 Epii.js 简约而不简单的JavaScript模板引擎 # 特性 一个轻量级模板引擎,可快速实现数据与ui绑定(数据变动,UI自动变动),快速实现事件绑 ...