Swift-'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类型。
Swift-'as?','as'用法的更多相关文章
- Swift - enumerateObjectsUsingBlock的用法
enumerateobjectsusingblock:不是Array的方法在NSArray使用.如果你想使用它,你需要一个实例NSArray而不是Array. import Foundation va ...
- swift函数的用法,及其嵌套实例
import Foundation //swift函数的使用 func sayHello(name userName:String ,age:Int)->String{ return " ...
- Swift继承的用法
一个类可以继承另一个类的方法,属性和其它特性.当一个类继承其它类,继承类叫子类,被继承类叫超类(或父类).在Swift中,继承是区分「类」与其它类型的一个基本特征. 在Swift中,类可以调用和访问超 ...
- swift - UIAlertController 的用法
ios 8 以后苹果官方建议使用UIAlertController这个类,所以专门去网上找资料,了解了下用法, 1.创建一个alertController let alertController = ...
- swift - UIAlertView 的用法
1,创建一个alertview,并带有“确定”和“取消”两个按钮 (注:在这里使用alertview,会报警告,那是因为从ios 8 以后,建议使用UIAlertviewController) //警 ...
- swift - UISlider 的用法
swift的UISlider的用法和oc基本没有区别 1.创建 class SecondViewController: UIViewController { var slider = UISlider ...
- swift - UISegmentedControl 的用法
一.创建控件,并监听控件选择值 /*选项除了文字还可以是图片 as关键字的作用就是字面意思:类型转换*/ let items = ["选项一", "选项二", ...
- swift UILable的用法
- Swift - UITableView的用法
因为倾向于纯代码编码,所以不太喜欢可视化编程,不过也略有研究,所以项目里面的所有界面效果,全部都是纯代码编写! 终于到了重中之重的tableview的学习了,自我学习ios编程以来,工作中用得最多的就 ...
- swift - UIToolbar 的用法
代码如下: 1.声明及初始化 var toolsBar = UIToolbar() toolsBar.frame = CGRect(x:, y:, width:SCREEN_WIDTH, height ...
随机推荐
- 纯css3实现图片三角形排列
当今是个读图时代.纯大部分网页或多或少都会用到图片.特别是图片较多的网页.图片的布局和排版就非常重要了.今天要给大写带来一款纯css3实现图片三角形排列.适合一系列的图片.效果图如下: 在线预览 ...
- 工厂模式——(Head first设计模式4)
所谓工厂,肯定是和生产有关.工厂模式主要包括工厂方法模式和抽象工厂模式,有些人把简单工厂也作为一种模式,在本文我分别讨论简单工厂模式,工厂方法模式,抽象工厂模式.这些模式中同样也和生产有关.接下来,我 ...
- Linux网络故障排查
1.先排查网络配置信息 IP地址->子网掩码->网关->DNS 2.查看到达的网关是否连通 ping IP地址. 3.查看DNS解析是否正常.
- 关于Trie树的模板
Trie树又称单词查找树,Trie树,是一种树形结构.是一种哈希树的变种.典型应用是用于统计.排序和保存大量的字符串(但不仅限于字符串),所以常常被搜索引擎系统用于文本词频统计. 它的长处是:利用字符 ...
- golang自定义返回error
在开发过程中, 标准库返回的error内容已经无法满足我们的需要时,发现builtin.go中error是一个interface, type error interface { Error() ...
- FFmpeg API变化
可以查看doc目录下的APIchanges和根目录下的Changelog 去掉了ffserver程序 'avcodec_register_all' is deprecated 还有av_regis ...
- 在网页中使用SVG
SVG可以作为一个独立的文件存在.但更多的时候,我们希望他能集成在某个更大的文档中,比如HTML.将SVG插入到HTML中主要有以下几种方式: 将 SVG 作为图像导入 将 SVG放入 iframe ...
- js学习笔记33----DOM操作
前面有讲过一些DOM的基本概念. 今天来说一下DOM 的一些基本操作,主要有创建节点,追加节点,删除节点. 1.创建DOM元素: createElement(标签名) —— 创建一个节点 append ...
- js学习笔记21----表格操作
1.获取表格元素: tHead : 表格头 tBody : 表格主体内容 tFoot : 表格尾 rows : 表格行 cells : 表格列 如获取表格第一行第一列的数据: <script ...
- laravel 控制器
1:如何快速的创建一个控制器 用cmd进入当前的项目名文件夹里面执行如下语句: php artisan make:controller HgjController 2:编辑Hgj中的index方法 ...