Swift学习笔记- 5.控制流

for 循环

Swift 提供两种 for 循环形式:

(1)for-in 用来遍历一个区间(range),序列(sequence),集合(collection),系列(progression)里面所有的元素执行一系列语句。

(2)for 条件递增语句。用来重复一系列语句。

for-in

可以使用 for-in 来遍历一个集合里所有的元素。

for index in 1...5 {
    println("\(index) times 5 is \(index * 5)")
}

 

上面的例子中,index 是一个每次被自动赋值的常量。在这种情况下,index 在使用前不需要声明,只需要将它包含在循环的声明中,就可以对其进行隐式声明,而无需使用 let 关键字声明。

如果你不需要知道区间内每一项的值,你可以使用下划线(_)替代变量名来忽略对值的访问:

let base = 3
let power = 10
var answer = 1

for _ in 1...power {
    answer *= base
}

println("\(base) to the power of \(power) is \(answer)")

 

使用 for-in 遍历一个数组:

let names = ["Anna", "Alex", "Brian", "Jack"]
for name in names {
    println("Hello, \(name)")
}

你也可以通过遍历一个字典来访问它的键值对。遍历字典时,字典的每项元素以(key,value)元组的形式返回,你可以在for-in 循环中使用显示的常量名称来解读(key,value)元组。

let numberOfLegs = ["spider": 8, "ant": 6, "cat": 4]
for (animalName, legCount) in numberOfLegs {
    println("\(animalName)s has \(legCount) legs")
}

除了数组和字典,你也可以使用 for-in 来遍历字符串中的字符:

for character in "Hello" {
    println(character)
}

for 条件循环

Swift 提供传统的 C 样式 for 循环:

for var index = 0; index < 3; index++ {
    println("index is \(index)")
}

格式:

  • for initialization; condition; increment {
    
  •     statements
    
  • }
    

Swift 中的 for 不需要使用圆括号

Switch

 

格式:示例:

  • switch some value to consider {
    
  • case value 1:
    
  •     respond to value 1
    
  • case value 2,
    
  • value 3:
    
  •     respond to value 2 or 3
    
  • default:
    
  •     otherwise, do something else
    
  • }
    

示例:

let someCharacter: Character = "e"
switch someCharacter
{
    case "a", "e", "i", "o", "u":
        println("\(someCharacter) is a vowel")
    case "b", "c", "d", "f", "g", "h", "j", "k", "l", "m", "n", "p", "q", "r", "s", "t", "v", "w", "x", "y", "z":
        println("\(someCharacter) is a consonatnant")
    default:
        println("\(someCharacter) is not a vowel or a consonant")
}

 

Switch 语句必须是完备的。每一个可能的值都必须至少有一个 case 分支与之对应。在 switch 的最后,必须有一个 default 语句。

每一个 case 分支都必须包含至少一条语句。下面的代码是无效的:

let anotherCharacter: Character = "a"
switch anotherCharacter {
case "a":
case "A":
    println("The letter A")
default:
    println("Not the letter A")
}

一个 case 可以包含多个模式:

switch some value to consider {

  • case value 1,
    
  • value 2:
    
  •     statements
    
  • }
    

注意:

如果想贯穿至特定的 case 分支,请使用 fallthrough 语句。

区间匹配

case 分支的模式也可以使一个值的区间。

let count = 3_000_000_000_000
let countedThings = "stars in the Milky Way"
var naturalCount: String

switch count
{
    case 0:
        naturalCount = "no"
    case 1...3:
        naturalCount = "a few"
    case 4...9:
        naturalCount = "several"
    case 10...99:
        naturalCount = "tens of"
    case 100...999:
        naturalCount = "hundreds of"
    case 1000...999_999:
        naturalCount = "thousands of"
    default:
        naturalCount = "millions and millions of"
}

println("There are \(naturalCount) \(countedThings)")

元组

你可以使用元组在同一个 switch 语句中测试多个值。元组中的元素可以是值,也可以是区间。另外,使用 “_” 来匹配所有可能的值

let somePoint = (1, 1)
switch somePoint {
case (0, 0):
    println("(0, 0) is at the origin")
case (_, 0):
    println("(\(somePoint.0), 0) is on the x-axis")
case (0, _):
    println("(0, \(somePoint.1)) is ont the y-axis")
case (-2...2, -2...2):
    println("(\(somePoint.0), \(somePoint.1)) is inside the box")
default:
    println("(\(somePoint.0), \(somePoint.1)) is outside of the box")
   
}

不像 C 语言,Swift 允许多个 case 匹配同一个值。如果存在多个匹配,只会执行第一个被匹配的 case 分支,剩下的 case 分支将会被忽略掉。

值绑定

case 分支的模式语序将匹配的值绑定到一个临时的厂里那个或变量,这些常量或变量在该 case 分支里就可以被引用了,这称为值绑定。

let anotherPoint = (2, 0)
switch anotherPoint {
case (let x, 0):
    println("on the x-axis with an x value of \(x)")
case (0, let y):
    println("on the y-axis with a y value of \(y)")
case (let x, let y):
    println("somewhere else at (\(x), \(y))")
}

注意:

这个 switch 语句不包含默认分支。这是因为最后一个 case 可以匹配所有值的元组,这使得 switch 语句已经完备了。

Where

case 分支的模式可以使用 where 语句来判断额外的条件。

let yetAnotherPoint = (1, -1)
switch yetAnotherPoint {
case let (x, y) where x == y:
    println("(\(x), \(y)) is on the line x == y")
case let (x, y) where x == -y:
    println("(\(x), \(y)) is on the lone x == -y )")
case let (x, y):
    println("(\(x), \(y)) is just some arbitray")
}

控制转移语句

switch 语句的 break

当在 switch 中使用 break思,会立即中断该 switch 代码块的执行,并且跳转到该 switch 代码块结束后的第一行代码。

这种特性可以被用来匹配或者忽略一个或多个分支。因为 Swift 需要包含所有的分支并且不允许有空的分支,有时为了使意图更明显,需特意匹配或忽略某个分支,当你想忽略某个分支时,可以在该分支内写上 break 语句。

 

let numberSymbol: Character = "三"
var possibleIntegerValue: Int?
switch numberSymbol {
case "1", "?", "一", "?":
    possibleIntegerValue = 1
case "2", "?", "二", "?":
    possibleIntegerValue = 2
case "3", "?", "三", "?":
    possibleIntegerValue = 3
case "4", "?", "四", "?":
    possibleIntegerValue = 4
default:
    break
}

if let integerValue = possibleIntegerValue {
    println("The integer value of \(numberSymbol) is \(integerValue)")
} else {
    println("An integer value could not be found for \(numberSymbol)")
}

贯穿

如果确实想要 C 风格的贯穿的特性,你可以在每个需要该特性的 case 分支中 hi用 fallthrough 关键字。

let integerToDescribe = 5
var description = "The number \(integerToDescribe) is"
switch integerToDescribe {
case 2, 3, 5, 7, 11, 13, 17, 19:
    description += " a prime number, and also"
    fallthrough
default:
    description += "an integer"
}

println(description)

时间: 2024-10-22 02:15:44

Swift学习笔记- 5.控制流的相关文章

swift学习笔记之控制流

使用 if和 switch来做逻辑判断,使用 for-in, for, while,以及 repeat-while来做循环.使用圆括号把条件或者循环变量括起来不再是强制的了,不过仍旧需要使用花括号来括住代码块 let hscores = [75,55,86,59,22] var teamScore = 0 for score in hscores { if score > 50 { teamScore += 3 print("这里是什么\(teamScore)") }else {

Swift学习笔记

Apple 新推的Swift已经好几天了.对于向我这样的oc都还没完全琢磨透彻的菜鸟来说--(简直就是福利啊,joke) 看了几天的Swift,只是有了基本的印象.总感觉比较换混乱,可能源自与自己没怎么学过脚本语言.索性,边看边记,加深印象. 本来部分内容源自Apple的<The Swift Programming Language>以及互联网教程.其余内容均为个人理解,不保证正确. 进入正题: 1.Swift是什么? Apple唤他作:雨燕.其实英语过了四级的都应该看出来,Swift还有一层

Swift学习笔记 - 可选 ?

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

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学习笔记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学习笔记(三)关于拷贝和引用

在swift提供的基本数据类型中,包括Int ,Float,Double,String,Enumeration,Structure,Dictionary都属于值拷贝类型. 闭包和函数同属引用类型 捕获则为拷贝.捕获即定义这些常量和变量的原作用域已不存在,闭包仍然可以在闭包函数体内引用和修改这些值 class属于引用类型. Array的情况稍微复杂一些,下面主要对集合类型进行分析: 一.关于Dictionary:无论何时将一个字典实例赋给一个常量,或者传递给一个函数方法时,在赋值或调用发生时,都会

Swift学习笔记十二:下标脚本(subscript)

下标脚本就是对一个东西通过索引,快速取值的一种语法,例如数组的a[0].这就是一个下标脚本.通过索引0来快速取值.在Swift中,我们可以对类(Class).结构体(structure)和枚举(enumeration)中自己定义下标脚本的语法 一.常规定义 class Student{ var scores:Int[] = Array(count:5,repeatedValue:0) subscript(index:Int) -> Int{ get{ return scores[index];

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

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

Swift学习笔记(二)参数类型

关于参数类型,在以前的编程过程中,很多时间都忽视了形参与实参的区别.通过这两天的学习,算是捡回了漏掉的知识. 在swift中,参数有形参和实参之分,形参即只能在函数内部调用的参数,默认是不能修改的,如果想要修改就需要在参数前添加var声明. 但这样的声明过后,仍旧不会改变实参的值,这样就要用到inout了,传递给inout的参数类型必须是var类型的,不能是let类型或者字面类型,(字面类型是在swift中常提的一个术语,个人认为就是赋值语句,也不能修改)而且在传递过程中,要用传值符号"&