首先我们先看下Objective-C与Swift语言对于可选nil的不同理解:
Objective-C中的nil:表示缺少一个合法的对象,是指向不存在对象的指针,对结构体、枚举等类型不起作用(会返回NSNotFound)
Swift中的nil:表示任意类型的值缺失,是一个确定的值,要么是该类型的一个值要么什么都没有(即为nil)

一、申明可选常量或变量

let status: Int? =    // 申明可选Int类型的常量,初始值为1
var defaultAddress: String? = "上海徐汇" // 申明可选String类型的变量,初始值为"上海徐汇"
var str: String? // 申明可选String(自定义的类)的变量,初始值为nil

注意:Int?与Int不相同,Int?表示可选的Int类型,可以赋值为nil,而Int不可以赋值为nil

二、使用"!"强制解析获取可选类型的值(不建议直接使用)
var defaultAddress: String? = "上海徐汇"
if defaultAddress != nil { // !=或==可以用来判断是否为nil
print("您的地址是\(defaultAddress!)") // 使用!强制解析
} else {
print("对不起,您不存在地址信息")
}
//您的地址是上海徐汇
var str: String?
print("str为\(str!)")
//Unexpectedly found nil while unwrapping an Optional value(XCode会提示运行错误,因为str初始值为nil,强制解析不行)
三、使用可选绑定获取可选类型的值(建议的用法)
var defaultAddress: String? = "上海徐汇"
if let address = defaultAddress { // 如果defaultAddress有值或类型转换成功,则将值赋值给address直接使用
print("您的地址是\(address)") // 使用address代替defaultAddress,且不需要加!强制解析
} else {
print("对不起,您不存在地址信息")
}
//您的地址是上海徐汇
四、隐式解析可选类型(用于申明时肯定有初始值,但后面可能为nil)
var mobileNumber: Int64! =  // 第一次申明有初始值
print("您的电话号码是\(mobileNumber)") // 不需要使用!强制解析
// 您的电话号码是Optional(13812345678)
// 还是不建议直接强制解析,因为实际项目中可能中间已经对该值做了改变,若为nil则会运行错误导致APP崩溃
if let number = mobileNumber { // 建议的做法
print("您的电话号码是\(number)")
// 打印内容:**您的电话号码是****13812345678**
} else {
print("您没有记录电话号码")
}
//您的电话号码是13812345678
五、空合运算符(用于判断变量或常量是否为nil)

空合运算符(a ?? b)将对可选类型a进行空判断,如果a包含一个值就进行解封,否则就返回一个默认值b.这个运算符有两个条件:

  • 表达式a必须是Optional类型
  • 默认值b的类型必须要和a存储值的类型保持一致

空合运算符是对以下代码的简短表达方法

a != nil ? a! : b

上述代码使用了三目运算符。当可选类型a的值不为空时,进行强制解封(a!)访问a中值,反之当a中值为空时,返回默认值b。无疑空合运算符(??)提供了一种更为优雅的方式去封装条件判断和解封两种行为,显得简洁以及更具可读性

下文例子采用空合运算符,实现了在默认颜色名和可选自定义颜色名之间抉择:

let defaultColorName = "red"
var userDefinedColorName: String? //默认值为 nil
var colorNameToUse = userDefinedColorName ?? defaultColorName
// userDefinedColorName 的值为空,所以 colorNameToUse 的值为 "red"
六、函数/方法返回类型为可选类型

A:返回值为可选类型的值(如Int?、String?、(Int, String)?、[Int]?、[Int: String]?等)

func returnPossibleValue(value: Bool) -> String? { // 返回类型为可选String类型
if value {
return "返回类型是可选类型值" // 如果为真,返回Int类型的值1
} else {
return nil // 如果为假,返回nil
}
} let possibleValue = returnPossibleValue(value: true) // 要用可选绑定判断再使用,因为possibleValue为String?可选类型
if let value = possibleValue {
print(value)
} else {
print("none value")
}

B:返回值为可选类型的类(如URL?、自定义Person?等)

class SomeClass {
var someValue: Int
init?(someValue: Int) { // 可失败构造器
if someValue == { return nil }
self.someValue = someValue
}
} func returnPossibleClass(value: Bool) -> SomeClass? { // 返回的类实例可能为nil
if value {
return SomeClass(someValue: ) // 返回的为nil
} else {
return SomeClass(someValue: ) // 返回的SomeClass?实例,不为nil
}
}

C:返回值为可选类型的闭包(如(()-> (void))? )

func returnOptionalFunc(value: Bool) -> (() -> (Void))? { // 返回类型为可选类型的闭包
if value {
return { () in
print("返回类型是可选类型闭包")
}
} else {
return nil
}
} let possibleFunc = returnOptionalFunc(value: true) // 要用可选绑定判断再使用,因为possibleFunc 为可选类型的闭包,类型为() -> (Void)
if let aFunc = possibleFunc {
print(aFunc()) // 注意增加()调用闭包,因为没有参数则是空括号
} else {
print("none func")
}
七、可选类型在类或结构体中的运用
A:可选类型在类中的运用
class PossibleClass {
var someValue: Int
var possibleValue: String? // 可选存储属性,默认值为nil
init(someValue: Int) { // 构造方法中可以不对possibleValue属性初始化
self.someValue = someValue
}
}
let someClass = PossibleClass(someValue: ) // 实例化对象时不需要对possibleValue初始化,someClass实例中:someValue为4,possibleValue为nil

注意:类中所有属性都需要有默认值。属性可以在申明时赋予初始值,也可以在构造方法中赋予初始值;子类继承父类时,必须先给自身属性先初始化后再继承父类构造方法初始化。一般的,出于安全的因素,子类的属性都赋予初始值或直接定义为可选类型。

B:可选类型在结构体中的运用

struct PossibleStruct {
var someValue: Int
var possibleValue: String? // 可选存储属性,默认值为nil
// 结构体中可以自定义一个init构造器对属性初始化,也可以不自定义
}
let someStruct = PossibleStruct(someValue: , possibleValue: nil)

Swift可选类型(Optional)之星耀的更多相关文章

  1. swift 可选类型(optional)

    可选类型定义 Swift 标准库中定义后缀  ?为可选类型 Optional<Wrapped> 的语法糖,这里语法糖可以简单理解为一种便捷的书写语法.也就是说,下面两个声明是等价的: va ...

  2. swift 可选类型笔记

    晚上十一点半了,看书累了,原本想睡了的,想了想,还是把刚看的总结一下,把这篇笔记写了吧.广州下雨,真特么的冷..好了,废话不说了,说正题说说Swift可选类型. 先定义一个变量: var string ...

  3. swift 可选类型(optional)--- swift 入门

    一.思维导图 二.代码 //这样无形中就会让代码很丑陋 if x != nil && y != nil { print("x或y都不等于空") } print(&q ...

  4. [swift]可选类型

    可选类型 <Swift权威指南>第2章千里之行始于足下——Swift语言基础,本章挑选了Swift语言的最基本特性加以介绍.尽管这些特性只占Swift全部特性的很少一部分,但却是所有的Sw ...

  5. Swift 可选类型-备

    我们先看看如下代码: var n1: Int = 10 n1 = nil         //编译错误 let str: String = nil    //编译错误 Int和String类型不能接受 ...

  6. Swift - 可选类型详解

    可选类型详解 直接上代码解释 // 类中所有的属性在对象初始化时,必须有初始化值 class Person : NSObject { var name : String? var view : UIV ...

  7. iOS:swift :可选类型

    import UIKit /*: 可选类型 * 可选类型表示变量可以有值, 也可以没有值 * C 和 Objective-C 中并没有可选类型这个概念 * Swift中只有可选类型才可以赋值为nil ...

  8. Swift可选类型

    可选类型 可选类型的介绍 注意: 可选类型时swift中较理解的一个知识点 暂时先了解,多利用Xcode的提示来使用 随着学习的深入,慢慢理解其中的原理和好处 概念: 在OC开发中,如果一个变量暂停不 ...

  9. Swift 可选值(Optional Values)介绍

    Optional的定义 Optional也是Objective-C没有的数据类型,是苹果引入到Swift语言中的全新类型,它的特点就和它的名字一样:可以有值,也可以没有值,当它没有值时,就是nil.此 ...

随机推荐

  1. iOS-UI控件之UITableView(四)- cell数据刷新

    TableView- 数据刷新 数据刷新 添加数据 删除数据 更改数据 全局刷新方法(最常用) [self.tableView reloadData]; // 屏幕上的所有可视的cell都会刷新一遍 ...

  2. H.264学习笔记5——熵编码之CAVLC

    H.264中,4x4的像素块经过变换和量化之后,低频信号集中在左上角,大量高频信号集中在右下角.左边的低频信号相对数值较大,而右下角的大量高频信号都被量化成0.1和-1:变换量化后的残差信息有一定的统 ...

  3. Java入门第38课——猜字母游戏之设计程序结构

    问题        本案例需要实现猜字母游戏程序中的程序结构 方案        分析猜字母游戏可以看出,程序首先需要随机产生5个不同的字母作为需要猜测的结果,因此,可以先定义一个方法,以实现此功能: ...

  4. WOJ600——水题

    第一次做本校OJ的题,被坑的好惨啊! 题目:600.Minimum  Distance 题目大意:给定平面上3个点A.B.C,求平面上的任一顶点P,使得|PA|+2|PB|+3|PC|. 由于刚好在这 ...

  5. WPF知识点--渐变色(LinearGradientBrush、GradientStop)

    [LinearGradientBrush-- 使用线性渐变绘制区域](https://msdn.microsoft.com/zh-cn/library/system.windows.media.lin ...

  6. Java IO(一)--File类

    File类不是单指文件,它既可以代表一个文件名称,又可以代表一个目录下的一组文件.可以用来创建.删除.遍历文件等 public static void main(String[] args) { St ...

  7. vue中滚动页面,改变样式&&导航栏滚动时,样式透明度修改

    vue中滚动页面,改变样式&&导航栏滚动时,样式透明度修改.vue <div class="commonHeader" v-bind:class=" ...

  8. JavaSE-11 接口

    学习要点 接口的定义 接口作为约定 接口作为能力 接口 为什么使用接口 需求描述 要求实现防盗门的功能(防盗门:带锁的门). 需求分析 门有“开”和“关”的功能,锁有“上锁”和“开锁”的功能. 将门和 ...

  9. python在linux下的使用

    1.查看python(解释器)的版本(什么版本的解释器支持哪一版版的语言标准) 一般在linux上已经预装了python,只要在Bash Shell中输入python,即可看到如下版本信息: 按Ctr ...

  10. python中的句柄操作

    python中的句柄操作 制作人:全心全意 通过窗口标题获取句柄 import win32gui hld = win32gui.FindWindow(None,u"Adobe Acrobat ...