[翻译]Swift Optionals:何时使用'as?'和'as' ?

本文由NikoXu (iOS 爱好者) 翻译

Swift Optionals:什么是Optional ?
Swift Optionals:何时使用'!'和'?' ?
Swift Optionals:何时使用'if-let' ?
Swift Optionals:何时使用'as?'和'as' ?

何时使用 'as?'和'as'##

让我们来继续为我们假象的UIKit应用写点代码。假设你需要出场(展示)一个新的modal view controller到手机的屏幕上(比如通过使用presentViewController(_, animated:, completion:)方法)。

//your custom view controller
class MyViewController: UIViewController {
    var lastUpdated: NSDate? = nil
}
 
//in your master view controller
let myVC = MyViewController()
presentViewController(myVC, animated: true, completion: nil)

你定义了一个拥有名为lastUpdated的额外属性的自定义view controller。让我们认定你是想当这个controller一旦登场时这个属性就要被修改。你可以在main view controller上通过** presentedViewController**方法获取这个出场了的controller:

controller.presentedViewController!.title = "New Title"

** presentedViewController是optional类型的UIViewController? ,因而你可以便捷的解包取得它的值并且使用这个值。但是如果我想使用或改变仅仅是被定义在MyViewController而没有定义在UIViewController?的 lastUpdated**该怎么做呢?

你可以通过as?把这样的对象转换成Optional类型,比如这样:

let myVC = controller.presentedViewController as? MyViewController
myVC?.lastUpdated = NSDate()

as?会尝试将值转换成给定的类型,而当这个过程不成功的时候便会返回一个nil对象。这就是为什么输出的结果总是一个optional 值。当你不能保证的转换成功时你不得不使用as?,比如你尝试把AnyObject或者Any value转换成一个实类(实体类)。

那么,简而言之,当你转换类型的时候可能失败时请使用as?。这非常有用。

与可能会出现转换错误时使用as?相对的,是当你可以101%保证转换会成功,你可以删除?直接使用as

让我们来看看使用as的一些实用的例子。

想想这样一个情况,你正在计算一个农场里羊的数目。然而你通过一些错综复杂的数学方法获得了一个带有小数的结果,比如:

let sheepCount = 71/2.0

现在sheepCount是一个Double类型,包含35.5的数值。当你需要一个整数并且Double类型转换成Int类型是安全的时候(一定能成功的把浮点部分切除掉),你才可以像下面这样把结果转换成Int类型:

let sheepCount = 71/2.0 as Int

在这种情况下,才是把这对象转换成Int类型,也就是说sheepCount常量会被转换成Int类型(相比而言,在之前的例子里sheepCount是Double类型的)。

另一种关于as情况是当你使用switch语句进行模式匹配。在switch模式中有且仅当转换是成功的通常会用as代替as?。比如你不知道sheepCount是什么类型,你可以通过switch语法检测它的类型并且尝试在不同的情况下使用对应的类型:

switch sheepCount {
  case let sheep as Int:
    println("\(sheep) found")
    
  case let sheep as Double:
    println("oops - fractional sheep!")
    
  default: break
}

在这个事例代码中,名为sheep的常量是一种非常复杂的类型——在前一种情况里是Int类型而在后一个情况里Double类型。

如果关于'as','as?','as!'依旧没能很好的理解可以看看官方文档关于Type Casting的部分,这里的介绍更为详细。中文翻译版

如何使用Optionals请阅读##

Swift Optionals:什么是Optional ?
Swift Optionals:何时使用'!'和'?' ?
Swift Optionals:何时使用'if-let' ?
Swift Optionals:何时使用'as?'和'as' ?

原文地址: Swift Optionals: When to use if let, when ? and !, when as? and as

翻译菌: 因为是分次翻译的,所以把原文分成4个较小的篇幅来翻译的。在学习Swift的路途上,如有不妥,望指正。

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

推荐阅读更多精彩内容