一天一步,成长
Optional,可选
通俗点讲,就是将一个变量类型设置为可选类型,这个可选类型如果没有赋值,那么就会自动变成一个nil,而nil在Swift中,没有什么特殊的含义,就是一个空值而已
当然了,类型可选在swift中可以作用于任何数据类型以及对象等.
其他的也就不多叨叨了,直接code+注释
我们走起:
//
// ViewController.swift
// Swift.Optional
//
// Created by NapoleonBai on 14-11-18.
// Copyright (c) 2014年 NapoleonBai. All rights reserved.
//
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
managerOptional()
}
//此函数用来管理测试optional
func managerOptional(){
//optional是switft提供的一种全新的.更加安全的数据类型---可选类型
//那么,我们应该怎样定义或者使用呢?
//其实,在程序的入口,我们已经看到过,不信,请看:
//AppDelegate.swift中的:var window: UIWindow?
//这里的window就是一个可选类型,那么开始我们的学习
//eg:
var age : Int?
//注意:这里的?是紧跟在类型名称后面的,否则无效
//当然了,这是可选类型的标准声明方式
//或许在其他语言中,age已经被初始化赋值了,swift中如何,我们看看
println("the age value is \(age?.description)") //the age value is nil
//这里打印是nil,说明这个age根本就没有赋值
/*
值得注意的是:
可能在OC中,nil代表一个空对象的指针,在Swift中,nil没有实际意义,就代表空
在可选类型,没有值的时候,都是返回一个nil,包括布尔类型,也不会返回false
nil不能用于非可选的常量或者变量,如果你得代码中可能会出现没有值得情况,请务必声明为可选类型.这样就会让程序自动让这个没有值得可选类型置为nil
*/
//当然.可选类型还有另外一种写法,那么就是使用关键字 Optional
//eg:
var nameOne : String?
var nameTwo : Optional<String>
//这里的nameOne 与 nameTwo定义的这两种形式,是相同的
//上面也提到了,可选类型是一种强大的安全类型机制,那么我们怎么才能体会到的安全到底在哪里呢?
//eg:
var numOne : Int?
if var maxValue = numOne{
maxValue+=1;
println("the maxValue = \(maxValue)")
}else{
println("the numOne = \(numOne)") //the numOne = nil
}
//很显然,执行了else
/*
原因:
1.声明的numOne并没有赋值,所以为nil
2.所以在var maxValue = numOne时,就没有执行变量的声明,当然也进不了if条件了,直接进入了else
3.如果numOne不为nil,那么,声明就会成功,而且自动推断为Int类型,所以会执行if条件
所以,在开发的时候,很多时候,有可能得到的是空对象,空值等等这样的.
比如,在Android中,就会出现空指针异常这样的.
在OC中使用空对象,也可想而知会出什么错误了.
Swift就这样避免了因为使用值为nil的对象导致程序异常,是不是很厉害,嘻嘻...
*/
//当然了,也许定义的可选类型,自己很肯定,而且程序运行起来也不会出现nil,那么就可以省点上面的判断,直接采用'!'的方式强制获取类型可选中的值,这种机制叫:"强制解析可选"
//eg:
//println("the numOne = \(numOne!)") //fatal error: unexpectedly found nil while unwrapping an Optional value
//可以看出,上面出错了,所以,在不确定的情况下,不要轻易这样使用
//当然了,这样写,不是仅仅为了节省判断是否为nil的代码,事实上这也是异常处理的捕获和处理机制中最常用的一种
var strA : String
//如果我们想要定义一个字符串类型的数据,没有设置为类型可选
//println("the strA = \(strA)")
//我们发现,在使用的时候就error了,编译通不过:error:Variable 'strA' used before being initialized
//就是提示使用前需要初始化
//所以,又有另外一种方式来帮忙了,那就是隐式解析可选
//eg:
var strB : String!
println("strB = \(strB)") //strB = nil
//当然,这并不是推荐这样使用的,推荐的是这样:
//在某个特定模块<函数>中,我们确定某个可选变量总是有值的,这个时候就可以使用这个.换句话说:隐式解析可选用于一个总是幼稚的可选类型实例声明
//提一个有趣儿的事情,就是在Optional的定义中没有任何一个规则禁止我们将一个可选类型再一次进行可选,所以,我们也可以这样做
//eg:
var strC : String??
//那么,问题就来了.'??' 除了这里将可选类型再一次可选,那么还有其他什么意思呢?
// 其实是有的,通过实例证明
//eg:
var numA : Int?
var numB = 23
var result = numA ?? numB
println("the result = \(result)")
//这样看,会有什么效果呢?大家可以猜猜
//其实是这样的,如果这里的numA = nil,也就是没有赋值的话,那么result = numB
//如果完成了赋值,那么result = numA
//是不是感觉有点像三目运算符的效果,嘻嘻...
//这就是"??"->可选运算符
//上面打印的结果就是:the result = 23
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
如果有什么不明白的,可以下面留言哟...
如果我知道,我就会慢慢讲解的;
如果我不知道,我会搞明白了再说的;
其实,我们也可以共同研究,这样不是更好..
嘻嘻....加油,一天一点,前进