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 ...
随机推荐
- 平板点餐软件编程体会---记我的Android编程之路
前言 想开发一个平板点餐系统,研究下陈江根大侠分享的一个很高水准的实例,只是个单机版无实用意义. (如需运行源码请回复联系邮箱) 实现 Mysql 数据库+Tomcat WEb服务器,使用Servle ...
- Android系统--输入系统(十四)Dispatcher线程情景分析_dispatch前处理
Android系统--输入系统(十四)Dispatcher线程情景分析_dispatch前处理 1. 回顾 我们知道Android输入系统是Reader线程通过驱动程序得到上报的输入事件,还要经过处理 ...
- Windows Redis默认配置文件,Redis配置不生效解决方案
Windows Redis默认配置文件,Redis配置不生效解决方案, Windows Redis自启动配置不生效解决方案,Windows Redis增加自动启动服务 >>>> ...
- MySQL IO线程及相关参数调优
一.关于一个SQL的简单的工作过程 1.工作前提描述 1.启动MySQL,在内存中分配一个大空间innodb_buffer_pool(其中log_buffer) 2.多用户线程连接MySQL,从内存分 ...
- Java 9 揭秘(13. Collection API 更新)
Tips 做一个终身学习的人. 在本章中,主要介绍以下内容: 在JDK 9之前如何创建了不可变的list,set和map以及使用它们的问题. 如何使用JDK 9中的List接口的of()静态工厂方法创 ...
- Java 三目运算符表达式的一些问题
最近在处理一个需求,需求描述如下:对数据库中查询出来的数据的某一个字段做一个简单处理.处理方式是:如果该字段的值(取值范围0~4,有可能为null)等于0,那么默认处理成1. 测试代码如下: publ ...
- pwnable.kr random 之 write up
---恢复内容开始--- 首先看源代码: #include <stdio.h> int main(){ unsigned int random; random = rand(); // r ...
- 花了一年时间开发的三维弯管机交互式转档软件(三维管子模型UG,SOLIDWORK,PRO/E文件转成YBC)
在弯管机加工中,由管子模型生成可直接进行弯管加工的YBC数据可以大大提高弯管编程过程.传统的做法是先用dxf数据文件(用autocad绘制管子的轴心线数据)转出XYZ数据,然后由XYZ数据转成YBC数 ...
- iOS-联系人应用(一)
环境:xcode6,iphone 4s simulator with iOS8.0 一.功能界面介绍 1.1 应用启动进入联系人列表页面,数据为模拟数据,来源与一个plist文件: 1.2 点击右上角 ...
- Uva 548 二叉树的递归遍历lrj 白书p155
直接上代码... (另外也可以在递归的时候统计最优解,不过程序稍微复杂一点) #include <iostream> #include <string> #include &l ...