【swift初见】Swift可选值Optionals

我们用oc开发的时候,经常会遇到null值的情况,如果不加任何判断的话可能会导致程序崩溃,swift语言添加了可选值这样的概念,基本语法如下:

可选类型:

var optValue: Int? = 8

在类型后面加一个?表示optValue这个值可以为nil,"?"就是可选值的一个标记,?其实是一个Optionals的类型,我们可以看看swift的源码:

enum Optional<T> : Reflectable, NilLiteralConvertible {
case None
case Some(T)

/// Construct a `nil` instance.
init()

/// Construct a non-\ `nil` instance that stores `some`.
init(_ some: T)

/// If `self == nil`, returns `nil`.  Otherwise, returns `f(self!)`.
func map<U>(f: (T) -> U) -> U?

/// Returns a mirror that reflects `self`.
func getMirror() -> MirrorType

/// Create an instance initialized with `nil`.
init(nilLiteral: ())
}

从源码可以看出,Optionals类型其实是一个枚举类型,一个是none,一个是非none:

因为optValue是一个可选值,所以可以把nil赋值给optValue,看看下面的代码:

var optValue: Int? = 8
optValue = nil
let optValue2 = optValue
println(optValue2)

这时候optValue是nil,把它赋值给optValue2的时候,程序会崩溃,但是可以用下面的方式:

var optValue: Int? = 8
optValue = nil

if let t = optValue {
    println("\(t)")
}else{
    println("nil")
}

如果optValue是nil,那么就不会执行赋值语句,程序就会打印nil出来,这就是可选绑定。

当需要对optValue强制解包的时候,在变量后面加一个!

比如:

var optValue: Int? = 8

var t: Int = optValue!
println(t)

这个时候会把optValue里面的int类型的值强制解包出来赋值给t,打印出来的值也是8;

隐式解析可选

有时候在程序架构中,第一次被赋值之后,可以确定一个可选总会有值。在这种情况下,每次都要判断和解析可选值是非常低效的,因为可以确定它总会有值。

这种类型的可选被定义为隐式解析可选(implicitly unwrapped optionals)。把想要用作可 选的类型的后面的问号(String?)改成感叹号(String!)来声明一个隐式解析可选。

当可选被第一次赋值之后就可以确定之后一直有值的时候,隐式解析可选非常有用。

let optValue: Int! = 8
if optValue != nil {
    println(optValue)
}

if let t = optValue {
    println(t)
}

var tm: Int = optValue
println(tm)

你可以把隐式解析可选当做一个可以自动解析的可选。你要做的只是声明的时候把感叹号放到类型的结尾,而不是每次取值的可选名字的结尾。

注意:如果你在隐式解析可选没有值的时候尝试取值,会触发运行时错误。和你在没有值的普通可选后面加一个惊叹号一样。

时间: 2024-09-28 06:51:38

【swift初见】Swift可选值Optionals的相关文章

Swift之Optional 可选值

Optional 是 Swift 的一大特色,也是 Swift 初学者最容易困惑的问题 定义变量时,如果指定是可选的,表示该变量可以有一个指定类型的值,也可以是 nil 定义变量时,在类型后面添加一个 ?,表示该变量是可选的 变量可选项的默认值是 nil 常量可选项没有默认值,主要用于在构造函数中给常量设置初始数值 //: num 可以是一个整数,也可以是 nil,注意如果为 nil,不能参与计算 let num: Int? = 10 如果 Optional 值是 nil,不允许参与计算 只有解

Swift编程语言学习1.6——可选值

可选值 使用可选(optionals)来处理值可能缺失的情况.可选表示: 有值,等于 x   或者没有值 注意: C 和 Objective-C 中并没有可选这个概念.最接近的是 Objective-C 中的一个特性,一个方法要不返回一个对象要不返回nil,nil表示"缺少一个合法的对象".然而,这只对对象起作用--对于结构体,基本的 C 类型或者枚举类型不起作用.对于这些类型,Objective-C 方法一般会返回一个特殊值(比如NSNotFound)来暗示值缺失.这种方法假设方法的

[iOS] Swift 初学手册:可选类型 (Optionals)

原文地址:http://blog.callmewhy.com/2014/09/23/beginners-guide-optionals-swift/ 几周前 (译者注:原文发表于6月24日),苹果发布了一个全新的编程语言: Swift .从那时起,我一直在阅读Swift 官方手册,并且在 Xcode6 beta 上把玩学习.我开始喜欢上了 Swift 的简洁和语法.我和我的团队一起学习这门全新的语言,并且将它和 Objective-C 这个有着30年历史的老伙计进行对比.同时,我们也在努力探索如

关于swift的可选值(optional)

关于可选值optional 不同于OC,swift引入了一个新的概念——可选值,了解这个optional,对于swift的学习至关重要 概念定义:可以有值也可以没有值(nil)的一个类型.换句话说,它有两个状态:有值,没有值(nil) 按我的理解,可选值是带有布尔类型加持的普通类型 如何定义一个可选值呢? 上面的代码简单定义了一个叫做optionalValue的可选值. 和普通的变量定义没有太大区别,唯一不同在于,这里多了一个问号,?是对普通值的封包 要加在类型后面,也就是说,在变量或者常量的所

swift的可选值(optional)

苹果那文档写了一大堆也没有好好的写一下可选值(optional)这个东西.就是在有一个“Optional Chaining”的章节,但是也不是很充分的说明.最后找了半天在“the basics”里墨迹了几句.如果你没找到optional这个东西的话,那你可能也错过了一个很重要的东西,非optional类型的变量,这个变量的值不能是nil.这一点和ObjC以及其他的编程语言如C#.Java什么的差别很大. var example : String = "hello world" exam

Swift::3::可选值

可选值(Optional) 在OC,一个class类型的变量,其值既可为一个有效的对象,亦可为nil.但诸如Int,Double等类型则没有nil值.比如,32位Int,超过最大值后,OC 会用NSNotFound处理,而不是nil值.Swift 比OC 更为灵活,直接在语法层面支持所有类型佳能用nil值--可选值(Optional) 如何使用 使用可选值,Swift 提供了非常简洁的方式,直接在类型后加'?',例如定义一个有可选值的整型变量: var optionalInteger: Int?

窥探Swift之新添数据类型元组与可选值

今天的博客中就总结一下关于Swift中相对Objc新添加的两个数据类型:元组(Tuple)和可选值类型(Optional).上面这两个类型是Swift独有的类型,使用起来也是非常方便的,今天就通过一些示例来介绍一下如何初始化和使用元组和可选值类型以及使用元组和可选值类型的场景.废话少说,直奔主题,在今天的示例代码中仍然是使用Playground来测试的.左边是代码,右边是Playground中的结果. 一.Swift中的元组(Tuple) 元组类似于C语言中的结构体(Struct),用来存储一组

swift 可选值

// 可选值 let cities_ = ["Paris": 2241, "Madrid": 3165, "Amsterdam": 827, "Berlin": 3562] //  madridPopulation 的类型是可选类型 Int?,而非 Int.一个 Int? 类型的值是 Int 或者特 //殊的 "缺失" 值 nil let madridPopulation: Int? = cities_[&

Swift学习笔记(2)--元组(Tuples)、Optional(可选值)、(Assertions)断言

1.Tuples(元组) 元组是多个值组合而成的复合值.元组中的值可以是任意类型,而且每一个元素的类型可以是不同的. 1>定义:使用()包含所有元素,用逗号分开,也可以对每个元素做命名 ? 1 2 let http404Error = (404, "Not Found") let http200Status = (statusCode: 200, description: "OK")  //重命名 2>获取元素: a.部分获取:是需要部分元素,其余忽略的