Swift 中的 Optionals 可选值的介绍和使用
来源:互联网 发布:redis 查询当前数据库 编辑:程序博客网 时间:2024/06/16 02:31
如果将 nil 赋值给 Swift 变量,将会产生编译错误:
var str:String = nil
Expression does not conform to type ‘NilLiteralConvertible’
也就是说,在 Swift 中,要使用一个变量必须为它指定一个初始值。这也是 Swift 中的类型安全的一个体现。
Optional
前面提到,在 Swift 中,我们对变量不能指定 nil 值,但我们定义变量时,并不一定总要进行初始化。还有,我们的方法返回值,也不一定总是有具体值。这就引出 Swift 中变量定义的一点不方便了。
这样,Swift 又为我们提供了 Optional 类型。我们可以这样理解它:Optional 类型变量的值是可选的(正如 Optional 类型的名称所指示的)。它可以包含具体的值,也可以不包含具体的值(为 nil 的值)。Optional 变量的定义方法如下:
var str:String? = nil
如上面代码所示,我们只需要在变量类型 String 后面添加一个问号 ?
, 就完成了 Optional 类型的定义。我们如果编译上面的代码,就不会产生任何编译错误,代码顺利的被编译通过了。
因为 Optional 类型的变量可以为 nil 值,所以在使用它们的时候就需要进行判断,在 Swift 中,如果直接使用值为 nil 的变量,应用就会崩溃。所以我们要进行必要的判断。
if str != nil {print(str!)} else {print("str is nil")}
我们注意到,print(str!)
这行代码,str变量的后面多了个叹号。这个叹号的意义我们后面会介绍到,现在暂时将它忽略。
Optional Binding
Optional Binding 是 Swift 中提供的一个用于判断 Optional 类型是否为 nil 的机制,它的语法如下:
if let constant = optionalVal {statements}
Optional Binding 应用于我们之前定义的 str 变量,就是如下方式:
if let strVal = str {print(strVal)}else{print("str is nil")}
这次再仔细看看这个输出语句 print(strVal)
, 是不是发现这次没有叹号了。这就引出接下来要说的啦。
Optional 拆包
在 Swift 中,Optional 并不是一个具体的类型,而是对类型的一个包装。 比如 var str:String?
可以理解为,它并不是一个 String 类型的变量,而是对 String 变量的一个包装。
看看下面的代码,就会更容易理解啦:
var strVal:String = “swift string variable”var strOptional:String? = “swift”string optionals”print(strVal)print(strOptional!)
因为 strVal
是一个普通变量,所以我们直接就可以访问到它所包含的值 print(strVal)
。而 strOptional
是一个 Optional 包装过的变量,所以要访问它所包含的值,就要对它进行拆包 print(strOptional!)
。这样前面我们一直在讨论的叹号的作用就一目了然了吧。
还记得上面提到的 Optional Binding 吗,这个语法规则会将 let
赋值的常量自动拆包,因此对于这个语法,就不需要显示的使用叹号进行拆包了。
if let strVal = str {print(strVal)}else{print("str is nil")}
隐式 Optional 拆包
从上面的介绍不难看出,对 Optional 的值进行拆包需要繁琐的使用 ! 语法。这样的操作会很麻烦,尤其是我们已经确认知道某些变量不会是 nil 值的时候。
let strOptional:String? = “An optional string.”print(strOptional!)let strImplictlyString:String! = “An implictly optional string.”print(strImplictlyString)
如上所示,声明 隐式拆包的 Optional 只需要将变量定义结尾的 ? 改成 ! 即可。对于这样声明的变量,在使用它的时候就不再需要加 ! 了。
- Swift 中的 Optionals 可选值的介绍和使用
- swift-可选值(optionals)
- 【Swift初见】Swift可选值Optionals
- Swift 可选(Optionals)类型
- swift 可选类型详解 (optionals)
- swift-基础06-元组和Optionals(可选)
- Swift对于可选类型(Optionals)讲解不错的文章
- 第八节swift 可选(Optionals)类型
- [iOS] Swift 初学手册:可选类型 (Optionals)
- Swift 初学手册:可选类型 (Optionals)
- swift 学习记录(可选类型 Optionals)
- Swift 初学手册:可选类型 (Optionals)
- Swift中的可选类型 (Optionals)与Objective-C中的nullability注解
- Swift可选类型的使用
- Swift中的可选类型(Optional)以及?和!的用法详解
- Swift中的可选协议和方法的历史渊源
- 1.7 Swift可选值, 隐式解析可选 swift 中的? !
- swift中的可选类型Optional?、解包!和隐式解包的可选类型的用法
- dockerfile
- Test_Java_File类递归练习(统计该文件夹大小)
- Android实现滚动条下拉反弹效果
- 【转】SAP中的FTP操作样例
- pt-table-sync
- Swift 中的 Optionals 可选值的介绍和使用
- dedecms织梦列表页内容页栏目高亮和当前栏目调用二级三级栏目
- java数据结构与算法-2-3-4树
- java 单点登录
- LeetCode.52 Maximum Subarray
- 5-7 使用函数求余弦函数的近似值
- angularjs自定义指令的隔离域问题--转载
- 实用插件(六)手机日历插件——LCalendar
- Git 查看stash的相关记录时间