循环(Loops)

1. For条件递增语句

 

1  for ( var counter = 0; counter < 8; counter++ ) 
2  {
3           liftWeights( )
4   }

 

 

 

语法是这样的:用for作为循环的开始,告诉Xcode你要声明一个循环了,for后面跟着括号,括号里面声明变量、条件和递增数值。例如:

1 for ( VARIABLE; CONDITION; INCREMENT ) 
2  {
3 
4  }

 

括号中的第一个部分是变量,用counter表示,计算已经完成的循环的数量,在平时编写程序时,这里的变量常常命名为counter(英文中counter有计数器的含义)然后设定初始值为零:

1 for ( var counter = 0; CONDITION; INCREMENT ) 
2  {
3 
4 }

 



条件后面的一个分号后面是递增值,递增值就是每次循环后变量counter的变化:

1 for ( var counter = 0; counter < 8; counter++ ) 
2  {
3 
4 }

 

 

然而苹果公司提供了简写方式,用两个加号++表示这个变量加1,例如:

counter++

 

作用和这个相同:

counter = counter +1

 

 

2. 区间(Ranges)

区间Range和整型数组中一个数字到另一个数字差不多,目前有两种区间,一种是闭区间,用三个小点表示,包含小点两边的数字:

1...5   //1,2,3,4,5

 

另外一种是半闭半开区间,用两个小点加上一个小于号表示,小于号右边的数字不包含在这个区间中:

1..<5     //1,2,3,4

 

在for-in循环中,可以使用区间来代替数组或者词典:

 1 for index in 1...5 
 2 {
 3     println ("The current number is (index)")
 4 }
 5 
 6  //打印结果为:
 7  //The current number is 1 
 8  //The current number is 2 
 9  //The current number is 3 
10  //The current number is 4 
11  //The current number is 5

 

 

3. 条件表达式

 

1 if isBirthdayToday == true 
2 {
3     singBirthdaySong ( )
4 }

 

  在上面的这个例子中,条件是isBirthdayToday == true,两个等号表示比较2个等号之间的数值,如果值相同,则结果为真,如果值不相同,则结果为假。

 

4. 可选类型(Optionals)

可选值是用来处理那些可能出现空值的变量。在某些情况下,你是无法确保一个变量是不是一定有值。例如,在西班牙语中的一个单词,可能无法直接翻译成英语的一个单词,这样就会出现空值。这种没有值的情况叫做nil。
可选值可以用在任何类型的变量中,在使用时将一个问号跟在类型后面,表示这是可选值:

1 var translatedWord: String?

 

因为可能为空的变量都必须名称表示,这样能确保所有的非可选值变量都会有值。这种设计模式帮助开发者避免了空值引起的程序崩溃。非可选值变量都必须有值,可选值变量可以没有值。
可选值不能直接使用,在使用之前需要解包(unwrapped)。把使用可选值变量想象成拆开一袋糖果,必须先要把包装撕掉才能吃到糖果。当一个可选值变量解包后,这个变量也可能是空值。这就相当于你拆开一颗糖果,结果发现里面什么也没有。
解包的过程帮助开发者记住去检查然后确保这个变量不是空值,用可选值有2个步骤,第一步,检查是不是为空,一般情况下用if表达式检查:

1 var translatedWord: String? = translate("cat")
2 if translatedWord != nil {
3        //translatedWord has a value
4  } else {
5      //The translatedWord has no value
6  }
View Code


一旦核查确实有值后,你必须解包。解包一个可选值非常简单,直接放一个叹号在变量后面即可,例如:
1 var translatedWord: String? = translate("cat")
2 if translatedWord != nil {
3     println(translatedWord!)    //gato
4 }
View Code

 

 

5. 枚举

  5.1声明一个枚举

  枚举声明的类型是囊括可能状态的有限集,且可以具有附加值。通过内嵌(nesting),方法(method),关联值(associated values)和模式匹配(pattern matching),枚举可以分层次地定义任何有组织的数据。
玩游戏的四个方向,如:
1 enum Movement{
2 case Left
3 case Right
4 case Top
5 case Bottom
6 }

 1 let aMovement = Movement.Left
 2 
 3 // switch 分情况处理
 4 switch aMovement{
 5 case .Left: print("left")
 6 default:()
 7 }
 8 
 9 // 明确的case情况
10 if case .Left = aMovement{
11 print("left")
12 }
13 
14 if aMovement == .Left { print("left") }

 

  使用上述多种模式匹配结构获取到Movement的枚举值,或者按照特定情况执行操作。


  我们无须明确指出enum的实际名称(即case Move.Left:print("Left"))。因为类型检查器能够自动为此进行类型推算。这对于那些UIKit以及AppKit中错综复杂的枚举是灰常有用的。

  5.2 枚举值
  想要为enum中每个case分配一个值。这相当有用,比如枚举自身实际与某事或某物挂钩时,往往这些东西又需要使用不同类型来表述。在C语言中,你只能为枚举case分配整型值,而Swift则提供了更多的灵活性。

1 // 映射到整型
2 enum Movement: Int {
3 case Left = 0
4 case Right = 1
5 case Top = 2
6 case Bottom = 3
7 }

 

  5.3获取枚举值

  倘若你想要读取枚举的值,可以通过rawValue属性来实现:

1 // 同样你可以与字符串一一对应
2 enum House: String {
3 case Baratheon = "Ours is the Fury"
4 case Greyjoy = "We Do Not Sow"
5 case Martell = "Unbowed, Unbent, Unbroken"
6 case Stark = "Winter is Coming"
7 case Tully = "Family, Duty, Honor"
8 case Tyrell = "Growing Strong"
9 }
1 //获取枚举值
2 
3 let bestHouse = House.Stark
4 print(bestHouse.rawValue)

 

  5.4通过一个已有的raw value来创建一个enum case。
  这种情况下,枚举提供了一个指定构造方法:

1 enum Movement: Int {
2 case Left = 0
3 case Right = 1
4 case Top = 2
5 case Bottom = 3
6 }
1 // 创建一个movement.Right 用例,其raw value值为1
2 let rightMovement = Movement(rawValue: 1)

  倘若使用rawValue构造器,切记它是一个可失败构造器(failable initializer)。换言之,构造方法返回值为可选类型值,因为有时候传入的值可能与任意一个case都不匹配。比如Movement(rawValue:42)。

 

参见:枚举中高级枚举实践



刚刚开始接触可选值的时候会有一些困惑和不习惯,其实你只要记住,一个可能为空的变量必须是可选值,而当可选值为空时就叫做nil。

 

内容来源于网络如有侵权请私信删除
你还没有登录,请先登录注册
  • 还没有人评论,欢迎说说您的想法!