Swift基础之05-可选类型

import UIKit

可选类型基础知识

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

1,可选类型定义
  • 方式一,不常用
let name:Optional<String> = 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)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268

推荐阅读更多精彩内容