Swift中的? ! as as? as!
?:
代表这是个可选类型(optional)的。如下,如果num有就为Int类型的,如果没有值那么就是nil。
let num:Int?
当我对number进行显示赋值时那么number就是Int类型的,如果没有对number电视赋值,那么number就为nil类型
let number:Int? =
!:
如果要操作一个optional类型的变量,需要先进行强解包,这就需要用到!了,如果有值就会得到变量的值,如果为nil那么程序就会crash
// 定义一个string的可选类型str,显式赋值
var str: String? = "Hello"
let message = "你好" + str!
print(message)
// 定义一个string的可选类型str,不进行显式赋值,就会出现crash
var str2:String?
let message2 = "你好" + str2!
print(message2)
在第二段中就会报如下错误:
Fatal error: Unexpectedly found nil while unwrapping an Optional value
as
有保证的转换,从派生类转换为基类的向上转型(upcasts)
使用场合1:从派生类转换为基类,向上转型
class Animal {}
class Cat: Animal {}
let cat = Cat()
let animal = cat as Animal
使用场合2:数值类型转换----消除二义性
let num1 = as CGFloat
let num2 = as Int
let num4 = ( / ) as Double
使用场合3:switch 语句中进行模式匹配
//如果不知道一个对象是什么类型,你可以通过switch语法检测它的类型,并且尝试在不同的情况下使用对应的类型进行相应的处理。
switch animal {
case let cat as Cat:
print("如果是Cat类型对象,则做相应处理")
case let dog as Dog:
print("如果是Dog类型对象,则做相应处理")
default: break
}
as!
强制类型转换,向下转型(Downcasting)时使用,如果转换失败会报 runtime 运行错误。
官方解释说这是一个不被保证的转换,可能会因为强转的失败而会导致崩溃。同时 !是一个陷阱的标志,就像⚠️一样,用起来存在一定危险性。
class Animal {}
class Cat: Animal {}
let animal :Animal = Cat()
let cat = animal as! Cat
as?
[as?] 和 [as!] 操作符的转换规则完全一样。但 [as?] 如果转换不成功的时候便会返回一个 nil 对象。成功的话返回可选类型值(optional)。由于 [as?] 在转换失败的时候也不会出现错误,所以对于如果能确保100%会成功的转换则可使用 [as!] ,否则使用 [as?] 。
let animal:Animal = Cat()
if let cat = animal as? Cat{
print("cat is not nil")
} else {
print("cat is nil")
}
参考链接:
swift里 as、as!、as?区别
Swift中的? ! as as? as!的更多相关文章
- swift 中关于open ,public ,fileprivate,private ,internal,修饰的说明
关于 swift 中的open ,public ,fileprivate,private, internal的区别 以下按照修饰关键字的访问约束范围 从约束的限定范围大到小的排序进行说明 open,p ...
- 阿里巴巴最新开源项目 - [HandyJSON] 在Swift中优雅地处理JSON
项目名称:HandyJSON 项目地址:https://github.com/alibaba/handyjson 背景 JSON是移动端开发常用的应用层数据交换协议.最常见的场景便是,客户端向服务端发 ...
- Swift中的可选链与内存管理(干货系列)
干货之前:补充一下可选链(optional chain) class A { var p: B? } class B { var p: C? } class C { func cm() -> S ...
- 在Swift中实现单例方法
在写Swift的单例方法之前可以温习一下Objective-C中单例的写法: + (instancetype)sharedSingleton{ static id instance; static d ...
- [翻译]理解Swift中的Optional
原文出处:Understanding Optionals in Swift 苹果新的Swift编程语言带来了一些新的技巧,能使软件开发比以往更方便.更安全.然而,一个很有力的特性Optional,在你 ...
- 窥探Swift之使用Web浏览器编译Swift代码以及Swift中的泛型
有的小伙伴会问:博主,没有Mac怎么学Swift语言呢,我想学Swift,但前提得买个Mac.非也,非也.如果你想了解或者初步学习Swift语言的话,你可以登录这个网站:http://swiftstu ...
- swift 中指针的使用UnsafeMutablePointer
在swift中已经弱化了指针的使用,可以这么使用 let s: NSRange = NSMakeRange(, ) let at = UnsafeMutablePointer<NSRange&g ...
- swift 中数据类型那个的转换
在swift中关于数据类型的转换,如果参数是可选类型? 那么打印或者转换的结果 会带有Optional 字样,,
- swift中Range的使用书名
在swift中Range有两种用法 1.把字符串转换成NSString来使用 //这里是把swift的字符换转换成了nsstring 使用 let str :NSString = text.strin ...
- 【iOS】在Swift中使用JSONModel
前言 首先所有的Model还是使用oc来写——看到这一句是不是想关网页了- - #,在swift里面直接写一直报错所以就将就用oc来写了,这里主要是分享一下搭配Alamofire使用的经验. 声明 欢 ...
随机推荐
- python 自动化之路 day 18 前端内容回顾、补充/Django安装、创建
前端回顾: 整体: - HTML - CSS - JavaScript - 基本数据类型 - for,while.. - DOM - obj = document.getElementById('.. ...
- 初窥ElasticSearch
初窥ElasticSearch 官网上面的,不知道讲的是什么.. youtube上面有一个start with,内容是在windows以下跑这个elastic search,然后用一个fidler工具 ...
- JS中的加号+运算符详解
加号+运算符 在 JavaScript 中,加法的规则其实很简单,只有两种情况: 把数字和数字相加 把字符串和字符串相加 所有其他类型的值都会被自动转换成这两种类型的值. 为了能够弄明白这种隐式转换是 ...
- EasyGBS国标流媒体服务器GB28181国标方案安装使用文档
EasyGBS - GB28181 国标方案安装使用文档 下载 安装包下载,正式使用需商业授权, 功能一致 在线演示 在线API 架构图 EasySIPCMS SIP 中心信令服务, 单节点, 自带一 ...
- 学习即语言的学习 “表示” “presentation”
w 龚升
- D3D9和OpenGL加载纹理图片的API是哪个?
D3D9 创建一个空纹理,当返回 S_OK 且 ppTexture 纹理对象指针不为 NULL 时,则表示该函数调用成功. HRESULT D3DXCreateTexture( _In_ LPDIR ...
- Vue.js之组件嵌套
Vue.js中组件嵌套有两种方式 第一种:注册全局组件 例如在components文件夹下新建一个User.vue组件,然后在main.js文件中注册全局组件 //注册全局组件 Vue.compone ...
- while循环。for循环
1.while循环 基本循环格式 while 条件 : # 循环体 # 如果条件为真,那么循环体则执行 # 如果条件为假,那么循环体不执行 break:退出本层循环. continue:退出本次循环, ...
- MapReduceTopK TreeMap
版权声明: https://blog.csdn.net/zhangxiango/article/details/33319281 MapReduce TopK统计加排序中介绍的TopK在mapredu ...
- Java的变量命名
Java的变量命名 1.首字母是英文字母.$和下划线,由字母.数字和下划线组成. [很常规] 2.变量的命名遵循见名知义的原则. [很重要,比如名字就用 name ,而不是用a.b.c这样的命名, ...