【Swift初见】Swift可选值Optionals

原创 2014年11月21日 14:22:45

我们用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)

你可以把隐式解析可选当做一个可以自动解析的可选。你要做的只是声明的时候把感叹号放到类型的结尾,而不是每次取值的可选名字的结尾。
注意:如果你在隐式解析可选没有值的时候尝试取值,会触发运行时错误。和你在没有值的普通可选后面加一个惊叹号一样。


版权声明:本文为博主原创文章,未经博主允许不得转载。

Swift 可选值(Optional Values)介绍

Optional也是Objective-C没有的数据类型,是苹果引入到Swift语言中的全新类型,它的特点就和它的名字一样:可以有值,也可以没有值,当它没有值时,就是nil。此外,Swift的nil也...
  • zhangao0086
  • zhangao0086
  • 2014年08月17日 19:02
  • 44322

Swift入门(四)——可选类型(Optionals)与断言(Assert)

可选类型是什么?首先看一个问题,Swift中String类型的变量有一个叫做toInt的方法,可以把String类型变量转换为Int类型变量。var stringValue = "5" var int...
  • abc649395594
  • abc649395594
  • 2015年07月31日 00:18
  • 2178

Swift:可选类型(Optional)

在我们使用objective-c表示字符串信息的时候,可以用下面方法书写。 NSString *str = @"秋恨雪"; str = nil; 因为objective-c是弱类型语言,所以这里的...
  • sinat_27706697
  • sinat_27706697
  • 2015年08月13日 10:54
  • 2693

Swift Optionals 初学者向导

本文是翻译原文地址是:http://www.appcoda.com/beginners-guide-optionals-swift/ iOS Swift语言已经发布。我也已经读了Swift的官方向导...
  • lupengyan
  • lupengyan
  • 2014年09月09日 17:05
  • 340

swift学习笔记之可选值和隐式可选解析

//可选值,可选类型,在swfit独有的,是OC中没有的,元组也是OC没有的 //可选值 //optValue 有值,没有值(nil) ,nil在oc中是空对象 //可选值可以用if语句进行判断var...
  • lcg910978041
  • lcg910978041
  • 2016年05月30日 11:09
  • 393

swift 可选类型,强制拆包,隐性拆包

当我们不知道变量的值时,可以将改变量设置为可选类型 //表明str是可选类型(string类型或者nil类型) var str:String? //表明str是可选类型(是stri...
  • yibuyibulai
  • yibuyibulai
  • 2015年07月13日 19:54
  • 2107

1.7 Swift可选值, 隐式解析可选 swift 中的? !

/**          可选值 : optionals          加上个问号          两种状态 一种是有值,另一种是没有值nil                    可...
  • sinat_20037505
  • sinat_20037505
  • 2016年12月12日 05:25
  • 260

swift中的可选类型Optional?、解包!和隐式解包的可选类型的用法

可选类型(?) /* 这个值要么存在, 并且等于x, 要么不存在 */举个例子 由于toInt方法可能会失败,因此它会返回一个可选的Int类型,而不同于Int类型。一个可选的Int类型...
  • rolandMan_
  • rolandMan_
  • 2015年02月11日 09:44
  • 3347

swift 可选值?

var a? 此处的a就是个可选值,意思是该值可能是缺失的. 可选 使用可选(optionals)来处理值可能缺失的情况。可选表示: -有值,等于 x 或者 没有值 注意:C 和...
  • jianguo_liao19840726
  • jianguo_liao19840726
  • 2015年12月18日 14:44
  • 287

swift 可选值

// 可选值 let cities_ = ["Paris": 2241, "Madrid": 3165, "Amsterdam": 827, "Berlin": 3562] //  madridPop...
  • baitxaps
  • baitxaps
  • 2016年05月08日 14:35
  • 350
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【Swift初见】Swift可选值Optionals
举报原因:
原因补充:

(最多只允许输入30个字)