Swift第二波

2016-12-30 02:39

使用可选类型,用来处理值可能缺失的情况,这样一来,我们的代码安全性能够提升很多

一般来说,这个可选类型就两种情况

  • 有值 就是x
  • 无值 就是nil

我们知道在OC中,是没有这个概念的,在OC中,比如我们有一个方法,有返回值,如果是返回的是对象,要么就是返回对象实例,要么返回nil表示值缺失。但是我们遇到需要返回枚举,我们就没办法了,一般我们会定义一个NotFound这种类型,但是在Swift我们就不需要了

我们举个例子

如果我们想讲一个字符串,强转成一个Int整形,我们知道,不可能每个字符串都能转成整数,像”123”这种可以转成整形,但是”ni hao”这种,能转成整形吗?你在逗我

let testString = "123"
let testString1 = "ni hao"

let testInt1 = Int(testString1)
let testInt2 = Int(testString)

Swift第二波0

这样代码并不会报错

我们可以手动来设置optional值

var serverResponseCode: Int? = 404
// serverResponseCode contains an actual Int value of 404
serverResponseCode = nil
// serverResponseCode now contains no value

注意,在Swift中,nil的定义和Objective-C中的nil定义不相同,在Swift中,nil只是用来表示值缺失,不管是对象,还是Int之类的基础类型,都可以使用nil来表示值缺失,但是在OC中就只有对象可以使用,因为在OC中是表示一个指向不存在对象的指针

如果你像下面这样定义了一个变量,不需要你声明他为nil,编译器会自动为他赋值nil,这根OC中 还是有较大的差别的

var surveyAnswer: String?

同样的,我们还是和OC一样,可以使用==或者!=来判断是否是nil

if surveyAnswer != nil{
 //做什么
}

如果,我们能够确定,这个变量,肯定是有值的,那么我们就可以使用强制解包,在其后面加上一个!

像这样

if surveyAnswer != nil{
 //我们已经知道surveyAnswer是肯定有值的
 print(surveyAnswer!)//强制解包 输出
}

在我们强制解包的时候,一定要确保这个值是有的,不然,会出现错误,导致程序崩溃

可选绑定

这个 厉害了,很好用的

我们可以在if 和 while 语句中使用 我就直接上代码了

if let actualNumber = Int(possibleNumber) {
 print("\"\(possibleNumber)\" has an integer value of \(actualNumber)")
} else {
 print("\"\(possibleNumber)\" could not be converted to an integer")
}
// Prints ""123" has an integer value of 123”

我们上面讲过,这个强转,转出来是一个optional值,我们在if语句中判断这个值,如果存在,则将这个值赋给actualNumber常量,在判断语句中需要使用到,如果转出来是一个nil,那么就跳到另外的语句中

还有更强大的

if let firstNumber = Int("4"), 
 let secondNumber = Int("42"), 
 firstNumber < secondNumber && secondNumber < 100 
{
 print("\(firstNumber) < \(secondNumber) < 100")
}
// Prints "4 < 42 < 100"
 
if let firstNumber = Int("4")
 {
 if let secondNumber = Int("42") 
 {
 if firstNumber < secondNumber && secondNumber < 100 
 {
 print("\(firstNumber) < \(secondNumber) < 100")
 }
 }
}
// Prints "4 < 42 < 100”

这么强大 的 if语句

隐式解析

有时候,我们很确定,一些变量或者常量,肯定是有值的,不需要声明为optional,不然我们每次使用的时候,都需要加上!来进行解包

Swift为我们提供了隐式声明

let absolutString: String! = "我肯定是有值的"

print(absolutString)//可以直接使用,不需要解包

错误处理

如果之前有写过Java的同学肯定对try catch很熟悉 在Swift中,使用try catch来进行错误的捕获和处理

func makeASandwich() throws {
 // 这个函数可能会抛出错误异常
}

 
do {
 try makeASandwich()//开始做三明治
 eatASandwich()//开始吃三明治
} catch SandwichError.outOfCleanDishes {//这里捕获到了异常,没有干净的盘子
 washDishes()
} catch SandwichError.missingIngredients(let ingredients) {//又捕获到了异常,没有原材料
 buyGroceries(ingredients)//买原材料
}

断言

断言是很好用的一个东西,而且鼓励大家使用断言。

断言是什么意思呢?就是我们在运行一个函数时,有事我们需要某个参数,比如一个Int一定要是一个大于0的数,如果不大于0,我们的函数就无法运行了,这时候,我们就可以使用断言了

let age = -3

assert(age >= 0, "A person's age cannot be less than zero")

这样程序就会检查age是否是大于等于0 的 如果不符合,程序就会终止,并且我们能够很快知道 为什么程序会终止

那我们什么时候需要用到断言呢?

  • 当传入一个int的下标时,比如传入数组的索引,这个整数的值可能会太大或者太小
  • 需要给函数传入一个值,但是非法的值可能导致函数不能正常执行。
  • 一个可选值现在是nil,但是后面的代码运行需要一个非nil值

到这里,我们Swift的基础部分就算是讲完了,后面就接着讲基础的一些运算,很快我们过掉,这些都是很简单的部分