这一部分,主要讲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. Struts 框架 之 文件上传下载案例

    Struts 框架 文件上传 1. 先准备 Struts 环境 (我使用的是struts 2.3.4版本) 导jar包:

  2. int-整数+bool-布尔功能介绍

    int #创建和转换 #a = 123#a = int(123)#转换 #Age = "22"#Age = int(22)#1.当前整数用二进制表示的最小位数 # age = 50 ...

  3. PHP基础知识1

    Php的变量和基本语法 1.变量/常量 2.Php数据类型和基本语法 基本语法 1.    html和php混编 2.    一个语句以:(分号)结束 3.    如何定义一个变量.和变量的使用 4. ...

  4. 字典的定义和操作 (Python)

    字典是由key and value 构成,无序结构(不想列表那样有固体位置): note:key 是唯一的,没有重复: 字典可以多级嵌套: 定义: dict1 = { # 由等式构成 dict = { ...

  5. request.setcharacterencoding()和request.setcontenttype(“html/css;charset”)的格式区别

    1.request.setCharacterEncoding()是设置从request中取得的值或从数据库中取出的值 指定后可以通过getParameter()则直接获得正确的字符串,如果不指定,则默 ...

  6. MySQL巧用自定义函数进行查询优化

    用户自定义变量是一个很容易被遗忘的MySQL特性,但是用的好,发挥其潜力,在很多场景都可以写出非常高效的查询语句. 一. 实现一个按照actorid排序的列 mysql; Query OK, rows ...

  7. Chrome浏览器 54 版本显示“Adobe flash player已过期”问题解决

    背景 电脑上面的软件很久没升级,用腾讯电脑管家批量做了一次升级,结果Chrome浏览器升级到54版本flash控件没法用了. 第一时间想到直接到flash官网下载一个新的进行安装,结果官网检测显示,C ...

  8. Eclipse详细设置护眼背景色和字体颜色并导出

    Eclipse详细设置护眼背景色和字体颜色并导出 Eclipse是一款码农们喜闻乐见的集成开发平台,但是其默认的主题和惨白的背景色实在是太刺激眼球了.下面,将给大家详细介绍如何设置成护眼主题的方法,也 ...

  9. Nlpir Parser灵玖文本语义挖掘系统数据采集

    在计算机广泛应用的今天,数据采集的重要性是十分显著的.它是计算机与外部物理世界连接的桥梁.各种类型信号采集的难易程度差别很大. 灵玖软件Nlpir Parser文本语义挖掘系统以分词技术为基础,集成了 ...

  10. oracle 审计日志清理

      --进入审计日志目录: cd $ORACLE_BASE/admin/$ORACLE_SID/adump --删除3个月前的审计文件: find ./ -type f -name "*.a ...