// // main.swift // OptionalDemo // // Created by 程磊 on 15/5/23. // copyright (c) 2015年 chenglei. All rights reserved. // import Foundation //可选类型 /* 可选类型表示,这个值要么存在并且等于x,要么不存在 */ let possibleNumber = "999"; let convertednumber: Int? = possibleNumber.toInt();//由于toInt可能会失败,因此它会返回一个可选的Int类型,而不同于Int类型,一个可选的Int类型被记为Int?,不是Int。问号表名它的值是可选的,可能返回是一个Int,也可能返回值不存在 var responseCode: Int? = 404;//要么存在且值为404 responseCode = nil;//要么不存在,我们可以赋值为nil ///可选类型类似于OC指针中指针的nil值,但是OC中nil只对类(class)有用,指针对象不存在,而Swift中的nil不是指针,它表示特定类型的值不存在。任何类型的可选类型都能赋值为nil,而不仅仅局限于对象类型,并且更安全。 /* 1.在Swift中,非可选类型不能用nil,nil只能用于可选类型中; 2.如果代码中的常量或者变量需要适配不存在的情况,务必将他声明为恰当的可选类型; 3.如果定义的可选类型的对象不提供默认值,则该对象将自动为nil 如:var strValue: String?; 默认值则为nil */ //var strValue = nil; var strValue: String? = "Hello"; //let hashValue = strValue.hashValue;//错误,因为上面声明的此变量为可选类型的,所以用strValue无法直接访问其方法 let hashValue = strValue?.hashValue; println("hashValue = \(hashValue)"); /* 总结 ? 的使用场景 1.声明Optional变量 2.用在Optional值操作中,用来判断是否响应后面的操作。 */ //解包(!的用法) /* 可选类型在每次访问的时候都会提前并检测它的值是否存在,但有时候根据程序结构就可以推断出可选类型在首次赋值之后必然存在值,这个时候,就不需要每次都检测值是否存在,如果确定一个可选类型的值一定存在,那么我们使用 "!" 进行解包获取它的值,或者使用Optional Binding */ let possibleString: String? = "An Optional String"; println("possibleString = \(possibleString!)");//确定该变量有值,则直接进行解包即可 let stringValue = possibleString!.hashValue; println(stringValue); //Optional Binding//等价于上面 if let sValue = possibleString { let stringValue = sValue.hashValue; } //关于隐式解包 /* 把隐式解包可选类型当成自动解包的可选类型。即不是每次使用的时候在变量/常量后面加!,而是直接在定义的时候加!,这些可选变量定义为隐式解包的可选量(implicitly unwrapped optional)。 隐式解包的可选量的声明格式为:在希望标为可选的类型名称后面,用感叹号(!)代替问号(?) 隐式解包的可选类型主要用在一个变量/常量在定义瞬间完成之后值一定会存在的情况。主要用在类的初始化过程中。 */ let assumeString: String! = "Hello"; println(assumeString); println(assumeString.hashValue);