Swift语言中与C/C++和Java不同的语法(二)
这一部分,主要讲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不同的语法(二)的更多相关文章
- Swift语言中与C/C++和Java不同的语法(一)
---恢复内容开始--- Swift作为苹果官方推出的IOS开发的推荐语言,在过去的几年间受到了越来越广泛的关注,其实编程的人都知道,不同的编程语言大同小异,掌握一门新的语言关键是了解它与其它语言不同 ...
- Swift语言中与C/C++和Java不同的语法(五)
这一节将会提到Swift中其他的关于函数的应用,这些内容包括有: 默认参数值和可变参数值.常量参数.返回函数类型和函数嵌套: 一.默认参数值和可变参数值 对默认参数值是指在函数的声明中就已经定义了参数 ...
- Swift语言中与C/C++和Java不同的语法(三)
这一部分的主要内容是Swift中的Collections 我们知道Java中的Collection基本上是每一个Java程序猿接触到的第一个重要的知识点. 在Swift中也不例外,Swift中的Col ...
- Swift语言中与C/C++和Java不同的语法(四)
这一节,我们将会讨论一下Swift中的函数相关的基本内容 首先是函数的创建: func sayHello (name:String) -> String { return "Hello ...
- Go语言中的slice
Go语言中的slice有点类似于Java中的ArrayList,但在使用上更加灵活,先通过下面一个小例子来体验一下如何通过一个已有的切片来产生一个新切片: func main() { slice := ...
- c语言中的scanf在java中应该怎么表达,Scanner类。
1 java是面向对象的语言 它没有像C语言中的scanf()函数,但是它的类库中有含有scanf功能的函数 2 java.util包下有Scanner类 Scanner类的功能与scanf类似 3 ...
- Java 语言中 Enum 类型的使用介绍
Enum 类型的介绍 枚举类型(Enumerated Type) 很早就出现在编程语言中,它被用来将一组类似的值包含到一种类型当中.而这种枚举类型的名称则会被定义成独一无二的类型描述符,在这一点上和常 ...
- 浅谈Java语言中ArrayList和HashSet的区别
Java语言中ArrayList和HashSet的区别 2019-04-10 13:22:49 一.基本区别 首先一起看个实例,其代码如下: package com.MrZ_baby.com; i ...
- 浅谈Java语言中try{}catch{}和finally{}的执行顺序问题
浅谈Java语言中try{}catch{}和finally{}的执行顺序问题 2019-04-06 PM 13:41:46 1. 不管有没有出现异常,finally块中代码都会执行: 2. 当t ...
随机推荐
- java基础系列--Exception异常处理
原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/7191280.html 1.概述 Java代码中的异常处理是非常重要的一环,从代码中可以看到 ...
- java面向对象浅析
1.(了解) 面向对象 vs 面向过程 例子:人开门:把大象装冰箱 2.面向对象的编程关注于类的设计!1)一个项目或工程,不管多庞大,一定是有一个一个类构成的.2)类是抽象的,好比是制造汽车的图纸. ...
- TP3.2写提交的验证码验证
把今天掌握的东西整理一下,要不然,我就忘干净了: 今天在做一个企业网站的时候,有一个在线留言的功能,最后提交的时候需要输入验证码.如图下: 当然,特连接的并不是我的后台 好了,开始了,首先我需要把验证 ...
- AllPairs运用遇到的问题及解决办法分享
前些天用AllPairs自动生成了交互式测试用例,中间遇到的问题困扰了一天,最后解决了.现在分享下解决过程 首先,D\AllPairs是我的ALLPairs安装目录,C盘桌面test.txt是我写的测 ...
- 关于ubuntu服务器上部署postgresql 以及安装pgadmin4管理工具(web版)
进入目录:cd pgadmin4 source bin/activate cd pgadmin4-1.6/ 启动pgadmin4:python web/pgAdmin4.py pgadmi ...
- ServerSocket与Socket类
ServerSocket与Socket类 TCP套接字协议: TCP最主要的特征就是能够建立长时间的连接,而且能够保证数据安全的送达,但是速度比较慢.使用TCP进行连接的时候会有三次握手,之后才建立起 ...
- git - 远程分支
对于用户来说,git给人提交到本地的机会.我们可以在自己的机器上创建不同的branch,来测试和存放不同的代码. 对于代码管理员而言,git有许多优良的特性.管理着不同的分支,同一套源代码可以出不一样 ...
- HDU1124 Factorial
Problem Description The most important part of a GSM network is so called Base Transceiver Station ( ...
- Oracle 12C 新特性 - “可插拔数据库”功能
Oracle 12C加入了一个非常有新意的功能"可插拔数据库"特性,实现了数据库(PDB)在"容器"(CDB)上的拔功能,既能提高系统资源的利用率,也简化大面积 ...
- 使用Node.js调用阿里云短信的发送以及接收
为了使用Node.js调用阿里云短信服务,我自己写了个npm包, 目前实现了: 使用Node.js调用阿里云短信服务,发送短信: 使用Node.js调用阿里云短信服务以及MNS服务,接收用户上行短信 ...