Swift语法笔记之可选类型

1.可选类型

  • 可选类型表示变量可以有值, 也可以没有值
  • C 和 Objective-C 中并没有可选类型这个概念
  • Swift中只有可选类型才可以赋值为nil
  • 如果你声明一个可选常量或者变量但是没有赋值,它们会自动被设置为nil

2.可选�类型格式

  • 格式: Optional<类型> 或 在类型后面加上?号
    var number: Optional<Int>

  • 可选类型的取值是一个枚举

  • None 没有值

  • Some 有值

  • 由于可选类型在Swift中随处可见, 所以系统做了一个语法糖, 在类型后面加上?
    var number: Int?
    注意:

    • nil不能用于非可选的常量和变量。如果你的代码中有常量或者变量需要处理值缺失的情况,请把它们声明成对应的可选类型。
    • Swift 的nil和 Objective-C 中的nil并不一样。在 Objective-C 中,nil是一个指向不存在对象的指针, 所以Objective-C只有对象类型才能被设置为nil(基本类型不行)。在 Swift 中,nil不是指针——它是一个确定的值,用来表示值缺失。任何类型的可选状态都可以被设置为nil,不只是对象类型。

3.推荐写法

var number1: Double?//如果初始化不写值,那么默认为nil
number = 2;

// Swift中可选类型的值不能当做普通类型的值来使用
// 如果想使用可选类型的值必须进行`解包`操作
// 只需要在变量/常量后面加上! 就可以解包
// * 解包代表着告诉系统, 该变量/常量中一定有值

var pi: Double?
pi = 3.14
print(pi)//打印出来是Optional(3.14)

4.解包

4.1强制解析(forced unwrapping)
  • 通过感汉号实现:!,如:number!
  • init? 构造函数, ?表示不一定能够实例化出对象
  • !表示告诉编译器一定有值, 编译能够通过, 如果运行时没有值就会直接崩溃
  • 提示: ? 和 ! 是所有刚刚接触Swift的OC程序员最最蛋疼的问题, 前期开发要注意多看文档和利用编译器提示解决(option + 左击鼠标变量)
    注意
  • 在Swift开发中, 尽量不要使用强制解包, 不安全
//let url: NSURL?
let url = NSURL(string: "http://www.baidu.com")
print(url)
url!
4.2可选绑定解包(optional binding)
  • 不需要考虑url是否有值, 能进入{}一定有值
  • 不仅可以用来判断可选类型中是否有值,同时可以将可选类型中的值赋给一个常量或者变量
  • 可选绑定可以用在if和while语句中
  • 提示: 在实际开发中,使用频率很高
  • 可选绑定中的变量/常量只能在if后面的{}中使用
if let temp = url {
    url//能进来,那么url是一定有值的
}
//但是当可选类型过多时,出现下面情况,代码看起来就非常low了
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 {//guard一般写在函数里
        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)
}

4.3隐式解析可选类型(implicitly unwrapped optionals)
  • 有时候在程序架构中,第一次被赋值之后,可以确定一个可选类型总会有值。在这种情况下,每次都要判断和解析可选值是非常低效的,因为可以确定它总会有值
  • 隐式解析可选类型, 并不需要每次都使用解析来获取可选值, 一个隐式解析可选类型其实就是一个普通类型,但是可以被当做非可选类型来使用
  • 格式: 将可选类型后面的?改为!
    示例: let loginBtn: UIButton!
  • 注意:如果一个变量之后可能变成nil的话请不要使用隐式解析可选类型。如果你需要在变量的生命周期中判断是否是nil的话,请使用普通可选类型
//这种多用于storyboard或xib连线时定义的属性
var button: UIButton!
button = UIButton()
print(button)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,298评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,701评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,078评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,687评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,018评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,410评论 1 211
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,729评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,412评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,124评论 1 239
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,379评论 2 242
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,903评论 1 257
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,268评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,894评论 3 233
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,014评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,770评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,435评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,312评论 2 260

推荐阅读更多精彩内容