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 ...
随机推荐
- bootstrap栅栏系统css中的col-xs-*、col-sm-*、col-md-* 的意义以及 bootstrap一个标签中,同时有 col-xs , col-sm , col-md , col-lg的理解
摘要: bootstrap栅栏系统css中的col-xs-*.col-sm-*.col-md-* 的意义: .col-xs- 超小屏幕 手机 (<768px) .col-sm- 小屏幕 平板 ( ...
- mybatis代理类Demo
前言 简单实现通过代理接口来实现对数据的查询demo,也是对mybatis的一个熟练.首先是编写接口代理. public interface IBookMapper { List<BookMod ...
- PCI_Making Recommendations
协作性过滤 简单理解从众多用户中先搜索出与目标用户'品味'相似的部分人,然后考察这部分人的偏爱,根据偏爱结果为用户做推荐.这个过程也成为基于用户的协作性过滤(user_based collaborat ...
- vue vuex的用法
1.引入 vue.js vuex.js 文件 2.创建Store文件 var sSatte=new Vuex.Store({ state:{}, mutations:{}, actions:{ ...
- Delphi Screen.DataModuleCount 总是返回 0!Delphi 的 Bug? DataModuleCount = 0
今天遇到一个很隐蔽的 Delphi 问题,不知做了什么,有一个功能总是不能使用,后来跟踪以下发现是因为 Screen.DataModuleCount 总是返回 0,而程序中一个函数正好要用到 ...
- (转)Oracle中的rownum,ROWID的 用法
场景:在书写oracle的sql语句时候,如果语句不存在主键,需要删除几条重复的记录,这个时候如果不知道oracle中的伪列,就需要把所有的重复记录先删除,再插入.这样做好麻烦,可以通过伪列来定位记录 ...
- 共享---samba
1. 虚拟机,可以采用共享文件夹 2. windows之间可以使用网络邻居共享 3. windows与linux,linux与linux之间建立samba服务器 4. 安装samba服务器 r ...
- 读Zepto源码之Deferred模块
Deferred 模块也不是必备的模块,但是 ajax 模块中,要用到 promise 风格,必需引入 Deferred 模块.Deferred 也用到了上一篇文章<读Zepto源码之Callb ...
- CRM权限管理
CRM权限管理 一.概念 权限管理就是管理用户对于资源的操作.本 CRM 系统的权限(也称作资源)是基于角色操作权限来实现的,即RBAC(Role-Based Access Control,基于角色的 ...
- Aero问题
有时候打开电脑会发现自己的桌面有点不一样,没有原来的好看.别着急,这是因为你的Aero没有正常启动.