zoukankan      html  css  js  c++  java
  • Swift 了解(2)

    循环(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。
  • 相关阅读:
    Binary Tree Zigzag Level Order Traversal
    Binary Tree Level Order Traversal
    Symmetric Tree
    Best Time to Buy and Sell Stock II
    Best Time to Buy and Sell Stock
    Triangle
    Populating Next Right Pointers in Each Node II
    Pascal's Triangle II
    Pascal's Triangle
    Populating Next Right Pointers in Each Node
  • 原文地址:https://www.cnblogs.com/EchoHG/p/7009893.html
Copyright © 2011-2022 走看看