iOS:swift :可选类型
import UIKit
/*:
可选类型
* 可选类型表示变量可以有值, 也可以没有值
* C 和 Objective-C 中并没有可选类型这个概念
* Swift中只有可选类型才可以赋值为nil
* 如果你声明一个可选常量或者变量但是没有赋值,它们会自动被设置为nil
* 格式: Optional<类型> 或 在类型后面加上?号
可选类型的取值是一个枚举
* None 没有值
* Some 有值
* 由于可选类型在Swift中随处可见, 所以系统做了一个语法糖, 在类型后面加上?
注意:
* nil不能用于非可选的常量和变量。如果你的代码中有常量或者变量需要处理值缺失的情况,请把它们声明成对应的可选类型。
* Swift 的nil和 Objective-C 中的nil并不一样。在 Objective-C 中,nil是一个指向不存在对象的指针, 所以Objective-C只有对象类型才能被设置为nil(基本类型不行)。在 Swift 中,nil不是指针——它是一个确定的值,用来表示值缺失。任何类型的可选状态都可以被设置为nil,不只是对象类型。
*/
var number: Optional<Int>
number = 10
number = nil
var number1: Int
number1 = 10
//number1 = nil
// 推荐
var number2: Double?
number2 = 20.1
//number2 = nil
// Swift中可选类型的值不能当做普通类型的值来使用
// 如果想使用可选类型的值必须进行解包操作
// 只需要在变量/常量后面加上! 就可以解包
// 解包代表着告诉系统, 该变量/常量中一定有值
var number3: Double
number3 = 3.14
print(number2)
print(number2!)
print(number3)
let sum = number2! + number3
/*
强制解析(forced unwrapping)
* init? 构造函数, ?表示不一定能够实例化出对象
* !表示告诉编译器一定有值, 编译能够通过, 如果运行时没有值就会直接崩溃
* 提示: ? 和 ! 是所有刚刚接触Swift的OC程序员最最蛋疼的问题, 前期开发要注意多看文档和利用编译器提示解决(option + click)
注意
* 在Swift开发中, 尽量不要使用强制解包, 不安全
*/
let url = NSURL(string: "http://www.520it.com")
print(url)
//print(url!)
let url1 = NSURL(string: "http://www.520it.com/图片/abc.png")
print(url1)
/*:
可选绑定(optional binding)
* 不需要考虑url是否有值, 能进入{}一定有值
* 不仅可以用来判断可选类型中是否有值,同时可以将可选类型中的值赋给一个常量或者变量
* 可选绑定可以用在if和while语句中
提示:
* 在实际开发中,使用频率很高
注意:
* 可选绑定中的变量/常量只能在if后面的{}中使用
*/
if let temp = url {
print(temp)
}
let value1: Int? = 10
let value2: Int? = 20
let value3: Int? = 30
let value4: Int? = 40
if let temp1 = value1 {
if let temp2 = value2 {
if let temp3 = value3 {
if let temp4 = value4 {
let sum = temp1 + temp2 + temp3 + temp4
}
}
}
}
/*:
guard
* guard语句是在Swift 2.0中引进的,它是用途是在未满足某个条件时,提供一个退出的路径
* 格式: guard 表达式 else{}
注意:
* guard中的变量/常量 可以在guard后面使用
* guard一般用于避免使用强制拆包, 优化代码结构
*/
func test(){
let value1: Int? = 10
let value2: Int? = 20
let value3: Int? = 30
let value4: Int? = 40
guard let temp1 = value1 else{
return
}
guard let temp2 = value2 else{
return
}
guard let temp3 = value3 else{
return
}
guard let temp4 = value4 else{
return
}
let sum = temp1 + temp2 + temp3 + temp4
print(sum)
}
test()
/*
隐式解析可选类型(implicitly unwrapped optionals)
* 有时候在程序架构中,第一次被赋值之后,可以确定一个可选类型_总会_有值。在这种情况下,每次都要判断和解析可选值是非常低效的,因为可以确定它总会有值
* 隐式解析可选类型, 并不需要每次都使用解析来获取可选值, 一个隐式解析可选类型其实就是一个普通类型,但是可以被当做非可选类型来使用
* 格式: 将可选类型后面的?改为!
* let xmgButton: UIButton!
注意:
* 如果一个变量之后可能变成nil的话请不要使用隐式解析可选类型。如果你需要在变量的生命周期中判断是否是nil的话,请使用普通可选类型
*/
let intValue: Int?
intValue = 10
print(intValue)
print(intValue!)
if intValue != nil {
print(intValue!)
}
if let temp = intValue {
print(temp)
}
var doubleValue: Double!
doubleValue = nil
doubleValue = 3.14
print(doubleValue)
iOS:swift :可选类型的更多相关文章
- swift 可选类型笔记
晚上十一点半了,看书累了,原本想睡了的,想了想,还是把刚看的总结一下,把这篇笔记写了吧.广州下雨,真特么的冷..好了,废话不说了,说正题说说Swift可选类型. 先定义一个变量: var string ...
- [swift]可选类型
可选类型 <Swift权威指南>第2章千里之行始于足下——Swift语言基础,本章挑选了Swift语言的最基本特性加以介绍.尽管这些特性只占Swift全部特性的很少一部分,但却是所有的Sw ...
- Swift 可选类型-备
我们先看看如下代码: var n1: Int = 10 n1 = nil //编译错误 let str: String = nil //编译错误 Int和String类型不能接受 ...
- Swift - 可选类型说明
可选类型是Swift的一个特色.它表示一个变量有可能有值,也可能没有值(nil). 声明的方式是“数据类型+问号”. 而当要使用一个可选类型的变量是,要在后面加感叹号“!”. 1 2 3 4 5 6 ...
- swift 可选类型(optional)
可选类型定义 Swift 标准库中定义后缀 ?为可选类型 Optional<Wrapped> 的语法糖,这里语法糖可以简单理解为一种便捷的书写语法.也就是说,下面两个声明是等价的: va ...
- Swift - 可选类型详解
可选类型详解 直接上代码解释 // 类中所有的属性在对象初始化时,必须有初始化值 class Person : NSObject { var name : String? var view : UIV ...
- Swift可选类型(Optional)之星耀
首先我们先看下Objective-C与Swift语言对于可选nil的不同理解: Objective-C中的nil:表示缺少一个合法的对象,是指向不存在对象的指针,对结构体.枚举等类型不起作用(会返回N ...
- Swift可选类型
可选类型 可选类型的介绍 注意: 可选类型时swift中较理解的一个知识点 暂时先了解,多利用Xcode的提示来使用 随着学习的深入,慢慢理解其中的原理和好处 概念: 在OC开发中,如果一个变量暂停不 ...
- swift 可选类型(optional)--- swift 入门
一.思维导图 二.代码 //这样无形中就会让代码很丑陋 if x != nil && y != nil { print("x或y都不等于空") } print(&q ...
随机推荐
- Lucene Core Solr
Apache Lucene - Welcome to Apache Lucene https://lucene.apache.org/ The Apache LuceneTM project deve ...
- SetLocalTime API函数设置本地时间(DateTimeToSystemTime函数,把TDateTime转换成TSystemTime)
procedure setLocalDateTime(Value: TDateTime);var lSystemDateTime: TSystemTime;begin DateTimeToSyst ...
- HEX文件格式学习笔记
这也是一篇学习摘抄:原文地址:http://blog.csdn.net/syrchina/article/details/7004998 为了编写一个可以按照自己的要求进行ISP的程序, ...
- USACO35 翻转奶牛(尺取法)
通过这道题了解了不少有关翻转的知识呢...... 首先,我们枚举翻转的区间长度k,假设i有个按钮,按下就可以让i~i+k-1翻转,那就有两个状态,按i或不按i(因为按两次相当于没按),那就往后扫一遍, ...
- Ubuntu+anaconda环境里安装opencv
在Ubuntu的Anaconda环境下安装OpenCV比较方便,直接在终端中输入以下命令: conda install --channel https://conda.anaconda.org/men ...
- bzoj 4521 电话号码
题目大意: 求$[L,R]$中,满足不同时存在4和8且有连续三个一样的个数 思路: 我为什么要记忆化搜索里带-1啊 我可真是个** 直接记忆化搜索记前两位是否有4,8以及是否满足连续 #include ...
- 【HNOI 2008】 越狱
[题目链接] 点击打开链接 [算法] 显然,越狱情况数 = 总情况数 - 不能越狱的情况数 很容易发现,总情况数 = M^N 不能越狱的情况数怎么求呢? 我们发现,不能越狱的情况,其实就是第一个人任选 ...
- 从0开始学习Hadoop(2) 环境准备-Win7主机与Ubuntu虚拟机共享文件夹设置
主机要跟虚拟机共享文件夹设置有很多种办法,这里提供一种本地用户的方式 1. 新增一个本地用户,密码等其他设置如下 2.选择文件目录,这是共享属性 Ubuntu端设置: 文件夹->连接到网络-&g ...
- 【180】IDL 读写 HDF 文件
HDF(Hierarchical Data Formats)数据格式由 NCSA 开发.HDF 提供了大量的数据模式,包括多维数组.表格.图像.注解和调色板.在下面的章节中,将描述 HDF 科学数据系 ...
- webpack 4.0 相关
Webpack 4.0发布了!! https://www.jianshu.com/p/3a13f1b37300 webpack详解 https://juejin.im/post/5aa3d2056fb ...