Swift基础之05-可选类型

import UIKit

可选类型基础知识

在swift中nil也是一种数据类型,只有可选类型可以赋值为nil,其他类型都必须进行对应类型赋值。
所以对于一些需要进行赋值nil的类型可以先定义为可选类型,然后赋值后调用的时候再进行可选类型的解包调用

1,可选类型定义
  • 方式一,不常用
let name:Optional = nil
  • 方式二:语法糖,其实是方式一的包装
var name01:String? = nil
2,可选类型赋值
name01 = optional("z")
name01 = "zhangdanfeng"//会自动包装optional
name01 = "jack"
3,可选类型取值
print(name01)//打印结果是:Optional("jack")
  • 需要强制解包(强制解包比较危险,如果内部没有赋值为nil,会直接崩溃)
print(name01!)//打印结果是:jack
  • 所以标准的解包过程应该先判断一下是否有值(但是这个比较麻烦,所以请看可选绑定)
if name01 != nil {
    print(name01!)
    print(name01!)
    print(name01!)
    print(name01!)
}
4,可选绑定(可选类型每次使用的时候都需要判断是有值,然后强制解包,为了避免这种重复操作,可以使用可选绑定,如下)
//先判断name01是否有值,如果有值,解包然后赋值给前面的name01, 如果nil则不执行
if let name01 = name01{
    print(name01)
}

可选类型的应用

  • 如果url中有中文,url就是空的;如果按照之前oc的方法就直接把空值传进request中了;
    如果在可选类型中,如果为空,那么就不会强制解包,也不会调用request方法
let url: NSURL? = NSURL(string: "http://www.baidu.comd")

if let url = url {
    let request = NSURLRequest(url: url as URL)
}

let path: String? = Bundle.main.path(forResource: "zhang.plist", ofType: nil)


可选类型的几种常见应用(补充)

  • 1,字符串和数字之间的直接转换

为什么要转换结果是可选类型:
转换成功那么结果是字符串,如果转换不成功,那么结果返回nil,这样的话转换结果就不仅仅是一个类型,那么只能用泛型,所以选择了可选类型,然后再转换后进行解包即可进行安全的使用。
(如果结果只是Int类型的话,转换不成功程序就会直接奔溃)

let str: String = "123"
let num: Int? = Int(str)//用可选类型可以在取值不成功的时候赋值为空,而不是直接报错崩溃
//因而可以赋值为可选类型,通过可选绑定对可选类型进行解包
if let num = num {
    print(num)
}

  • 2,根据文件名取文件路径
let path: String? = Bundle.main.path(forResource: "zhang.plist", ofType: nil)
path//当然左边也可以赋值为字符串,那么右边就需要强制解包,如果为空,直接崩溃

if let path = path {
    print(path)
}

  • 3, 字符串转成url
let url = URL(string: "http://wwwzhang在.baidu.com")
if let url = url {
    print(url)
}
  • 4,从字典中取出元素

  • any类型和any的可选类型是两种类型,如果根据键取可能取到值,也可能取不到值,所以从字典或者字符串中取得的值的类型是any的可选类型,需要进行解包后才是any类型*

let dict:[String : Any] = ["name":"zhang","age":20,"num":200]

let namezzz: Any? = dict["dd"]

print(namezzz ?? "取值错误,可能是键值不对")

if let namezzz = namezzz {
    print(namezzz)
}

类型转换

as ? 转换成可选类型,所以如果结果没有会直接返回为nil,不会崩溃
as ! 转换成具体类型,所以如果结果会直接崩溃

let str01 = "www.baidu.com"
(str01 as NSString).substring(to: 6)
  • 1,as ?:转换成一个可选类型,系统判断之后,如果可以转化成功,则转化可选类型,转化不成功则返回nil

let name01 = dict["name"] as? String//as ?在转化失败的时候会返回nil,而如果用as !,那么直接崩溃哦
if let name01 = name01 {
    print(name01)
}

//上面代码简化:
if let name01 = dict["name"] as? String{
    print(name01)
}
//这一步和直接不适用as ?的区别在于:有时候不能确定name对应的值是字符串的时候可以先转化一下,如果已经知道肯定是字符串,则可以直接不用as ?


  • 2,as !:转换成一个具体类型,系统判断之后,如果可以转化成功,则转化可选类型,转化不成功则崩溃
let name02 = dict["name"] as! String//as ?在转化失败的时候会返回nil,而如果用as !,那么直接崩溃哦
print(name02)

你可能感兴趣的:(Swift基础之05-可选类型)