• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

Swift-'as?','as'用法

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

何时使用 '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类型。


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
iOS开发:Swift多线程NSThread的使用发布时间:2022-07-13
下一篇:
Swift 3 新特性和迁移详解发布时间:2022-07-13
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap