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

1.Tuples(元组)

  元组是多个值组合而成的复合值。元组中的值可以是任意类型,而且每一个元素的类型可以是不同的。

  1>定义:使用()包含所有元素,用逗号分开,也可以对每个元素做命名

?





1

2

let http404Error = (404, "Not Found")

let http200Status = (statusCode: 200, description: "OK"//重命名

  

  2>获取元素:

    a.部分获取:是需要部分元素,其余忽略的元素使用下划线代替:      


let (statusCode, _) = http404Error
println("The status code is \(statusCode)")

    b.按下标获取,下标初始值从0开始

?





1

2

3

4

5

let http404Error = (404, "Not Found"

// 通过元组.0获取第二个值 

println("The status code is \(http404Error.0)"

// 通过元组.1获取第二个值 

println("The status message is \(http404Error.1)"

    c.按名字获取,适用于重命名的情况

?





1

2

3

let http200Status = (statusCode: 200, description: "OK"

println("The status code is \(http200Status.statusCode)"

println("The status message is \(http200Status.description)"

  

2.Optional(可选值)

  1>.定义:当值可能不存在(may be absent)的时候使用Optionals. 文档中解释说:"There is
a value, and it equals x." or "There isn‘t a value at
all."

    注:if语句可以判断Optionals有没有值

?





1

2

3

4

5

6

7

8

9

10

11

12

//1.显示定义

//不确定是否有值,使用?

var opt1:String? = "OptOne"

if opt1 {println("opt1:\(opt1)")}

//确定以后用在其他地方的时候肯定有值,使用!

var opt2:String! = "OptTwo"

if opt2 {println("opt2:\(opt2)")}

//2.隐式定义,在类型转换时,不确定是否可以转换成功,所以转换后的对象都是隐式的Optional

var
opt3 = opt2.toInt()

if opt3 {println("opt3:\(opt3)")}

  

  2>.optional binding(可选绑定)

    使用可选绑定(optional
binding)
来判断可选是否包含值,如果包含就把值赋给一个临时常量或者变量。可选绑定可以用在ifwhile语句中来对可选的值进行判断并把值赋给一个常量或者变量

?





1

2

3

4

5

6

if let actualNumber = possibleNumber.toInt() {

    println("\(possibleNumber) has an integer value of \(actualNumber)")

} else
{

    println("\(possibleNumber) could not be converted to an integer")

}

// 输出 "123 has an integer value of 123"

  3>.解析

    a.强制解析(forced unwrapping):在optional对象后面跟惊叹号表示此对象必然有值,可以直接使用

?





1

2

3

4

5

6

if convertedNumber {

    println("\(possibleNumber) has an integer value of \(convertedNumber!)")

} else
{

    println("\(possibleNumber) could not be converted to an integer")

}

// 输出 "123 has an integer value of 123"

  

    b.隐式解析可选(implicitly unwrapped
optionals):有时候在程序架构中,第一次被赋值之后,可以确定一个可选总会有值。在这种情况下,每次都要判断和强制解析可选值是非常低效的,因为可以确定它总会有值。为了解决这一情况,把想要用作可选的类型的后面的问号(String?)改成感叹号(String!)来声明一个隐式解析可选

  

?





1

2

let assumedString: String! = "An implicitly unwrapped optional string."

println(assumedString)  // 从此以后不需要感叹号,每次都是强制解析

  

      

3.Assertions(断言)

可选可以让你判断值是否存在,你可以在代码中优雅地处理值缺失的情况。然而,在某些情况下,如果值缺失或者值并不满足特定的条件,你的代码可能并不需要继续执行。这时,你可以在你的代码中触发一个断言(assertion)来结束代码运行并通过调试来找到值缺失的原因。

使用断言进行调试

断言会在运行时判断一个逻辑条件是否为true。从字面意思来说,断言“断言”一个条件是否为真。你可以使用断言来保证在运行其他代码之前,某些重要的条件已经被满足。如果条件判断为true,代码运行会继续进行;如果条件判断为false,代码运行停止,你的应用被终止。

如果你的代码在调试环境下触发了一个断言,比如你在 Xcode
中构建并运行一个应用,你可以清楚地看到不合法的状态发生在哪里并检查断言被触发时你的应用的状态。此外,断言允许你附加一条调试信息。

你可以使用全局assert函数来写一个断言。向assert函数传入一个结果为true或者false的表达式以及一条信息,当表达式为false的时候这条信息会被显示:

?





1

2

3

let age = -3

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

// 因为 age < 0,所以断言会触发

  

在这个例子中,只有age >=
0
true的时候代码运行才会继续,也就是说,当age的值非负的时候。如果age的值是负数,就像代码中那样,age
>= 0
false,断言被触发,结束应用。

断言信息不能使用字符串插值。断言信息可以省略,就像这样:

assert(age >= 0)

何时使用断言

当条件可能为假时使用断言,但是最终一定要保证条件为真,这样你的代码才能继续运行。断言的适用情景:

    • 整数的附属脚本索引被传入一个自定义附属脚本实现,但是下标索引值可能太小或者太大。

    • 需要给函数传入一个值,但是非法的值可能导致函数不能正常执行。

    • 一个可选值现在是nil,但是后面的代码运行需要一个非nil值。

时间: 2024-10-10 23:24:36

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

Swift学习笔记(二):属性、元组

一.属性的getter和setter //设置计算型属性:其并不真正的存储值,而是每次通过其他值计算得来 var subtotal: Double { //getter:通过total.taxPct计算获得total的值 get { return total / (taxPct + 1) } //setter:更新的是相关的值(比如此处基于newSubtotal来设置total.taxPct的值) set(newSubtotal) { //... } } 二.元组 | Tuples //创建一个

Swift学习笔记 - 可选 ?

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

SWIFT学习笔记02

1.//下面的这些浮点字面量都等于十进制的12.1875: let decimalDouble = 12.1875 let exponentDouble = 1.21875e1 let hexadecimalDouble = 0xC.3p0//==12+3*(1/16) 2.//类型别名,用typealias关键字来定义类型别名 typealias AudioSample = UInt16 var maxAmplitudeFound = AudioSample.min 3.//元组 let ht

Swift学习笔记(三):Protocols and Delegates

一.协议 | Protocols 协议用于定义完成某些功能所需要的方法和属性,协议本身并不提供这些功能的具体实现,只是用来描述这些实现.类.结构体.枚举通过提供协议所要求的方法.属性的具体实现来采用协议.能够满足协议要求的类型称之为协议的遵循者. 协议可以要求遵循者提供特定的实例属性.实例方法.类方法.操作符或下标脚本等. //创建一个协议,协议说声明了一个方法Speak protocol Speaker { func Speak() } //类Vicki遵循Speaker协议,在类中具体实现了

Swift学习笔记(5)--字典

1.定义 //1.基本定义 [key 1: value 1, key 2: value 2, key 3: value 3] var dict = ["name":"Xiaoqin","sex":"female","age":"20"] for (key,value) in dict { println(key,value) } //2.类型强制定义 Dictionary<keyT

SWIFT学习笔记05

1.Swift 无需写break,所以不会发生这种贯穿(fallthrough)的情况.2.//用不到变量名,可用"_"替换 for _ in 1...power { answer *= base } 3.case 可以匹配更多的类型模式,包括区间匹配(range matching),元组(tuple)和特定类型的描述. 可以这样用case case 1...3: naturalCount = "a few" 4.如果存在多个匹配,那么只会执行第一个被匹配到的 ca

Swift学习笔记四:数组和字典

最近一个月都在专心做unity3d的斗地主游戏,从早到晚,最后总算是搞出来了,其中的心酸只有自己知道.最近才有功夫闲下来,还是学习学习之前的老本行--asp.net,现在用.net做项目流行MVC,而不是之前的三层,既然技术在更新,只能不断学习,以适应新的技术潮流! 创建MVC工程 1.打开Visual studio2012,新建MVC4工程 2.选择工程属性,创建MVC工程 3.生成工程的目录 App_Start:启动文件的配置信息,包括很重要的RouteConfig路由注册信息 Conten

Swift学习笔记十:属性

1.存储属性       1. 作为特定类或结构实例的一部分,存储属性存储着常量或者变量的值.存储属性可分为变量存储属性(关键字var描述)和常量存储属性(关键字let描述). struct student{ let name = "" var score = 0 } let a = student(name:"小笨狼",score:96)           注意:                ① 定义储存属性时,需要为每一个属性定义一个默认值.在初始化的时候,

Swift学习笔记(一):基础

一.常量 & 变量 //常量 let constantsTeam = 1 //变量 var variablesTeam = 2 尽可能使用常量,这样更清晰并且内存更不容易肾亏. 二.显示/隐式指定类型 //隐式 let inferredTeam = 3 //显式 let explicitTeam:Int = 4 三.字符串输出 //通过\(变量或常量名)来引用组合字符串 println("\(inferredTeam) is bigger than \(variablesTeam)!&q