• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

Swift入门基础可选类型

武飞扬头像
程序员华仔
帮助5

前言

我们都知道,Swift语言相对其他编程语言来说,引入了一些新语法。了解和掌握这些语法是学习或使用Swift语言的基础。这里,结合自身的经验,系列地介绍下Swift的新语法,希望能帮助需要帮助的人。

首先要介绍的是可选类型(Optional)。

概念

Swift的可选类型,主要用于值缺失的情况。它表示可能存在一个值,也可能没有值

一般地,我们声明一个变量,默认情况下是非可选类型(non-optional),也就是说,变量需要赋初值并且不能为nil。如:

  1.  
    var num:Int = 10
  2.  
    var str:String = "hello"

如果你硬要把一个非可选类型的变量赋值为nil,那么编译器就会报错。例如var num:Int = nil。为什么会报错呢?因为编译器针对nil,只能用于可选类型,非可选类型不能赋值nil。

可选类型的使用

对于可选的声明,一般有如下两种方式:

  1.  
    1. var num:Optional<Int>
  2.  
     2. var num:Int?  

 对于上述两个式子,声明一个可选变量,若没有提供初始值,它的值会默认为nil。

可选类型分析

看源码定义(在Optional.swift文件):

  1.  
    enum Optional<Wrapped> {
  2.  
    case none
  3.  
    case some(Wrapped)
  4.  
    }

它就是一个枚举类型。当前枚举接收一个泛型参数Wrapped。

当Wrapped有值时,走some流程,其值就是Wrapped的值;

若Wrapped没有值,就走none流程,什么也没有,就是nil。

实例化起来就是:

声明一个可选类型的变量

war age:Int?=10

转化为:

  1.  
    switch age{
  2.  
    case nil:
  3.  
    print("age 为nil")
  4.  
    case.some(let val):
  5.  
        print("age的值是\(val)")
  6.  
    }

可选类型解包

可选类型就像一个容器一样,外面包裹了一层,实际的数据是在可选类型内部。对于不解包的可选类型是不能运算的。例如

  1.  
    var a:Int? =10
  2.  
    var b:Int? = 5
  3.  
    var sum:Int = a b

//这里不能做加号运算。因为a b 实际上是 Optional(10) Optional(5)。

需要对可选类型解包。目前有两种解包方式:

1.强制解包

2.可选项解包 

强制解包

顾名思义就是不管内部值是否有值,直接解包。若内部没有值,直接解包,程序就会崩溃。

强制解包的方式:

一般通过在可选值后面加上!,例如

上例中var sum:Int = a! b! 

这种方式看似简洁,但会忽略编译器警告,并且当结果为nil时会直接闪退。

能确定某个值不可能是nil时,使用强制解包

若存在没值的情况,不能使用强制解包.因一强制解包,程序就崩溃。

可选解包

可选解包比强制解包就优雅些,它先做是否有值判断。若没有值就返回nil,否则就返回真实值。这样的好处是程序不会崩溃。

可选项解包,一般有以下两种方式 

1.if let:如果有值,则会进入if流程

2.guard let:如果为nil,则进入else流程

if - let

if - let 语句会检查可选值是否为 nil,如果不是nil,便会解包可选值。

  1.  
    if let num = num1{
  2.  
    print(num)
  3.  
    } else {
  4.  
    //没有值,nil
  5.  
    }

guard - let

guard let 刚好是 if not let 的意思,可选解包为nil的情况,走guard的else部分,一般直接返回。正常流程继续执行。感觉就是异常流程就直接返回,正常流程继续执行。

  1.  
    func test(value:Int) {
  2.  
    guard let v = value else{
  3.  
    return //没有值,nil
  4.  
    }
  5.  
    // 不为nil流程
  6.  
    ....
  7.  
    print(value)
  8.  
    }

隐式解包

隐式解包,是在声明类型的时候,加上!。区别强制解包

这种方式声明的变量,在使用的时候系统会强制解包,可不是可选类型。一旦值为nil,使用时候依然会程序崩溃。 

例如:

let num:Int!= 12  //Int!仍然是可选类型

num = 1    //13

系统强制解包num,如果num为nil,就会崩溃。

避免可能的程序崩溃有两种方式:

1.确定隐式解包没有为nil的情况。就可以放心的使用。

2.若存在nil的情况,可使用可选解包。

例如:

  1.  
    if let tmpNum = num {
  2.  
    tmpNum = 1
  3.  
    }

可选值绑定

使用可选绑定(optional binding)来判断可选类型是否包含值,如果包含就把值赋给一个临时常量或者变量。在可选类型中,我们已经使用了可选值绑定。

  1.  
    if let num = num1 {
  2.  
     
  3.  
     
  4.  
    }
  5.  
    guard let v = value else{
  6.  
    return //没有值,nil
  7.  
    }

好处就是判断可选类型是否有值。

Object-C中nil与Swift中的nil的区别

OC:nil是一个指向不存在对象的指针,只有对象类型才能赋值为nil。

Swift:nil不是指针,是一个确定的值。任何类型的可选状态都可设置为nil,不只是对象类型。

OC:nil只对类(class)有用,

Swift:可选类型对所有的类型都可用且更安全。

OC:对nil对象发送消息是安全的,不会崩溃;(delegate?.handle()//delegate如果为nil,handle将不会被执行)Swift:可通过可选链实现。

总结:

1.声明变量的时候,若存在可能为有值或者没有值的情况,可以考虑使用可选类型。

2.可选类型的使用需注意:要解包才能使用。

3.对于解包,建议使用可选解包,这样不对导致程序崩溃。

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhfgkkhk
系列文章
更多 icon
同类精品
更多 icon
继续加载