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

一、申明可选常量或变量

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

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

二、使用"!"强制解析获取可选类型的值(不建议直接使用)
var defaultAddress: String? = "上海徐汇"
if defaultAddress != nil { // !=或==可以用来判断是否为nilprint("您的地址是\(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! = 13812345678 // 第一次申明有初始值
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: Intinit?(someValue: Int) { // 可失败构造器if someValue == 1 { return nil }self.someValue = someValue}
}func returnPossibleClass(value: Bool) -> SomeClass? { // 返回的类实例可能为nilif value {return SomeClass(someValue: 1) // 返回的为nil} else {return SomeClass(someValue: 2) // 返回的SomeClass?实例,不为nil
    }
}

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

func returnOptionalFunc(value: Bool) -> (() -> (Void))? { // 返回类型为可选类型的闭包if value {return { () inprint("返回类型是可选类型闭包")}} 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: Intvar possibleValue: String? // 可选存储属性,默认值为nilinit(someValue: Int) { // 构造方法中可以不对possibleValue属性初始化self.someValue = someValue}
}
let someClass = PossibleClass(someValue: 4) // 实例化对象时不需要对possibleValue初始化,someClass实例中:someValue为4,possibleValue为nil

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

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

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

转载于:https://www.cnblogs.com/jiackyan/p/7986052.html

Swift可选类型(Optional)之星耀相关推荐

  1. Swift——可选类型Optional

    Swift中有规定:对象中的任何属性在创建对象时,都必须有明确的初始化值. 注意:强制解包是非常危险操作,如果可选类型为nil,强制解包系统会崩溃 建议:在强制解包前,先对可选类型进行判断,判断是否n ...

  2. swift可选类型_Swift可选

    swift可选类型 Swift Optional is a very important underlying concept in Swift programming. Optional is so ...

  3. Swift之深入解析可选类型Optional的底层原理

    一.Optional 简介 Swift 的可选(Optional)类型,用于处理值缺失的情况,可选表示"那儿有一个值,并且它等于 x "或者"那儿没有值". S ...

  4. iOS开发笔记之九十四——Swift中的可选类型Optional

    一.Optional类型的概念 Swift中为何要引入Optional的概念,官方文档中有介绍: Swift also introduces optional types, which handle ...

  5. Swift 可选类型(补充)

    // 可选类型 // 可选类型: 这个值要么存在等于X,要么这个值根本就不存在 var serverResponseCode : Int? = 404 // ?的意思是这个只存在为404,要么这个值就 ...

  6. Swift3.0可选类型(Optional)倾心总结

    本篇主要对Swift3.0版本的可选类型经常使用的场景及注意点加以总结,当做以后可以随时翻译的资料:因为本篇为自己编码时候的总结,难免会有遗漏,希望广大读者加以补充 Swift3.0 Optional ...

  7. Swift中的可选类型(Optional)

    为什么80%的码农都做不了架构师?>>>    Swift中的可选类型(Optional) ##什么是Optional Optional在Swift中表示可选类型,那么什么是可选类型 ...

  8. Swift中关于可选类型(?)与强制解析(!)的特性

    2019独角兽企业重金招聘Python工程师标准>>> Swift中问号表示这是一个可选类型,白话翻译:某个常量或者变量可能是一个类型,也可能什么都没有,我不确定它是否真的会有值,也 ...

  9. swift_010(Swift 的可选类型)

    //***********swift--1.3--可选类型--*************************** // (Optionals)即在某个数据类型后面加上问号(?)或感叹号(!) // ...

最新文章

  1. gbase 导出_GBase 8a导出本地文件时多了目录,gbase_export_directory参数用处
  2. querySelector querySelectorAll
  3. Linux 高可用(HA)集群之Pacemaker详解
  4. BZOJ4161 常系数齐次线性递推
  5. 编程题A+B Format的总结(第二次作业一)
  6. [转]使用Yii CUploadedFile上传文件(图片)
  7. Qt定时器的精度问题
  8. Anaconda中软件库更新
  9. rocketMq 顺序消费
  10. python tk mainloop原理_理解Tkinter mainloop()的逻辑以及为什么变量没有重新分配它们的原始值?...
  11. java+swing+教科书,java+Swing+学生事务管理系统
  12. Mysql中将查询出来的多列的值用逗号拼接
  13. 【优化算法】差分松鼠搜索优化算法(DSSA)【含Matlab源码 1330期】
  14. acwing每日一题之贝茜放慢脚步
  15. PMSM学习笔记1——永磁同步电机的工作原理与数学模型
  16. HTML绘制齿轮,使用css3制作齿轮loading动画效果
  17. 【分析】编程和数学是什么关系?为什么编程学习这么火?
  18. Windows10系统安装软件时显示“无法访问Windows Installer服务。Windows Installer没有正确安装时可能发生这种情况。” or “错误2:系统找不到指定的文件”
  19. 8.node多进程之spawn
  20. AISummit全球人工智能技术大会顺利开幕:首日精彩回顾

热门文章

  1. VGG 图像打标签工具
  2. 启动mongo数据库
  3. 蓝牙耳机电脑玩游戏进入没声音设置
  4. 2023年全国最新工会考试精选真题及答案36
  5. Yolov3:win10下训练自己的数据(GPU版)(详细步骤)
  6. 微信公众号模板消息推送问题汇总
  7. 微信小程序如何获取高清用户头像
  8. Google工具包Guava——聊聊代码校验Preconditions
  9. Xbox 360抢鲜测评
  10. 医疗项目(HIS)业务简单介绍