关闭

Swift语言学习笔记(二)

标签: IOSSwift
145人阅读 评论(0) 收藏 举报
分类:


35.  for..in循环中,不需要特殊声明循环变量:

forindex in 1..5 {

println(index)

}

上面例子中,index不需要提前声明,这种情况下index为常量,且其作用域仅在循环中。例如,如果我们在外面声明一个index,则对循环中的index不产生影响:

varindex : Int = 0

forindex in 1...6 {

   println(index)

}             //循环输出123456

println(index)                //  输出0

上面的例子中循环外面的index和里面的index一个是变量,一个是常量。

如果我们不需要在循环中实用计数器,则使用下划线“_”来占位:

for_ in 1...10 {

   println("test")

}

36.  Dictionary中的元素是无序的,因此在遍历的时候,取出来的元素未必依照构建的顺序。

37.  Swift中的forwhiledo…while循环的判断条件头不需要加括号,ifswitch语句的判断条件也不需要加括号。

38.  Switch语句每一个case可以匹配多个项目,项目之间使用逗号分隔,case之间不需要使用break来跳出,默认一条匹配case执行完成后就跳出switch结构继续执行,当然添加break语句也不报错,如果你确实需要在一条case完成后继续执行下一条case,可以在前一条case最后使用fallthrough关键字来实现。每条case内必须至少有一句可执行语句。下面是一个switch的标准结构:

switchmyCondition {

case“condition1”:

doSomething1()

case“condition2”, “condition3”:

doSomething2()

default:

doOtherThings()

}

39.  Switch可以使用范围运算符来批量匹配:

switchuserCount {

case0:

     println(“no users”)

case1..100:

   println(“a few users”)

case100..1000:

   println(“many users”)

case1000..10000:

   println(“lots of users”)

default:

   println(“too many users to count”)

}

40.  Switch结合元组进行匹配,使用下划线来代表任意匹配:

vartargetPosition = (1, 2)

switchtargetPosition {

case(0, 0):

   println(“target is at the origin”)

case(_, 0):

   println(“target is on the x-axis”)

case(0, _):

   println(“target is on the y-axis”)

case(-10…10, -10…10):

   println(“target is within the range”)

default:

   println(“target is out of the range”)

}

注意,在Swift中允许一个条件匹配多个case,例如这里(0,0)可以匹配所有的case,但是当它匹配到第一个case之后,其他的case就被跳过了,所以case的顺序就显得非常重要了。

41.  Switch中可以使用变量绑定,在匹配项中使用临时变量或常量来记录匹配到的项目,以便在case的代码块中使用,例如:

switchposition {

case(let x, 0):

   println(“position is on the x-axis, x value is \(x)”);

case(0, let y):

   println(“position is on the y-axis, y value is \(y)”);

case(let x, let y):

   println(“position is (\(x), \(y))”);

}

当使用变量绑定的时候,变量位置匹配任何值。

42.  Switch语句中允许使用where关键字来定义匹配条件,例如:

lettwoAges = (10, 36)

switchtwoAges {

case(let age1, let age2) where age1 == age2:

   println(“these two people are of the same age”)

case(let age1, let age2) where age1 > age2:

   println(“the first people is older”)

case(let age1, let age2) where age1 < age2:

println(“the second people is older”)

}

43.  Swift中可以嵌套Switch语句。

44.  Swift中可以为循环和Switch语句添加标签,当多个循环嵌套在一起的时候,可以通过标签来区分breakcontinue具体作用域哪一个循环和Switch。例如(例子没有实际意义,只是说明用法):

forLoop1: for index in 1..10 {

    var index1 = 0

    whileLoop1: while index1 < index {

        switch1: switch(index, index1) {

        case (let x, lety) where x == y:

           continue whileLoop1

        case (let x, lety) where x > y:

           break switch1

        case (let x, lety) where x < y:

           continue forLoop1

        default:

           break

        }

    }

}

45.  函数定义:

funcfunctionName(param1 : type1, param2 : type2 …) -> returnType {

   //do something

   return …

}

使用关键字func来定义,圆括号内用逗号来隔离多个参数(如果没有参数,则使用空括号),每个参数使用冒号来分隔参数名和参数类型,使用箭头“->”来指明返回值(如果没有返回值,则省略这部分),严格地说,如果不指定返回值,函数仍然是有返回值的,真正的返回值是一个空的元组,即()。

46.  可以使用元组来让函数返回多个值,例如:

funcfuncWithMultiReturnValues() -> (returnValue1 : Int, returnValue2 : Int,) {

return (1, 2)

}

47.  如果想要在调用函数的时候强制调用者写出参数名,则可以为参数定义外部名称,定义了外部名称的参数在调用的时候必须写出外部名称来调用,例如:

funcadd(num1 param1 : Int, num2 param2 : Int, num3 param3 : Int) -> Int {

   return param1 + param2 + param3

}

println(add(num1: 1, num2 : 2, num3 : 3))

48.  如果函数参数的外部名称和内部名称相同,不需要写两个相同的名称,只需要在名称前加一个“#”号即可。例如:

funcadd(#num1 : Int, #num2 : Int, #num3 : Int) -> Int {

   return param1 + param2 + param3

}

println(add(num1: 1, num2 : 2, num3 : 3))

49.  定义函数参数的时候可以使用默认值,具有默认值的参数一定要在函数参数列表的末尾,例如:

funcadd(num1 : Int, num2 : Int = 0, num3 : Int = 0)  ->{

   return num1 + num2 + num3

}

println(add(1))

println(add(1,num2 : 2))

println(add(1,num2 : 2, num3 : 3))

注意到我们在调用的时候,后两次调用都指明的num2和num3,如果不这样做会有编译错误,这是因为Swift中如果一个参数定义了默认值而没有指定外部名称,则Swift会认为这个参数的外部名称和内部名称相同,在调用时会强制调用者指定参数的外部名称进行调用。

50.  可变参数列表用来指定函数可以接受可变数量的参数,一个函数只能有一个可变参数列表,且它必须出现在参数列表的最后(以类型+”来构成),如果参数列表中同时存在默认值,则可变参数列表在具有默认值的参数后边,例如:

funcadd(numbers : Int…) {

Int total = 0

for num in numbers {

    total += num

}

return total

}

51.  Swift中函数的参数默认情况下是常量,尝试去修改参数会导致编译错误。但是可以通过在参数定义前面添加var关键字来表明参数为变量,例如:

functest(var param : Int) {

   //…

}

但是尽管定义为变量,参数修改并不会反馈到传入的变量中去,例如下面的例子中,n的输出仍然是1:

funcaddOne(var num : Int) {

   num++

}

varn = 1

addOne(n)

println(n)

如果我们希望函数内对于参数的修改能够在函数结束的时候仍然保留,则通过inout关键字来修饰(注意,这种情况下在传参时必须传变量作为参数,且在调用时该参数前面需要添加“&”),inout参数不能指定默认值或者为参数列表,例如下面的例子中n的输出为2:

funcaddOne(inout num : Int) {

   num++

}

varn = 1

addOne(&n)

println(n)

52.  函数类型用来描述函数具有什么样的参数和返回值,例如func add(num1 : Int, num2 :Int) -> Int {…}的类型是(Int,Int)->Int,表明函数要传入两个Int型的参数,返回一个Int型的返回值。可以使用函数类型来定义变量,例如:

varaddFun : (Int, Int)->Int = add

println(addFun(1,2))

addFun还可以用别的方法来赋值(同样具有(Int,Int)->Int类型的函数)。

可以将函数类型作为参数的类型,例如:

funccallFunc(funcName : (Int, Int)->Int, a : Int, b : Int) -> Int{

   return funcName(a, b)

}

println(callFunc(add,1, 2))

函数类型也可以被当做函数返回值。

53.  函数之间可以进行嵌套,默认情况下,嵌套在其他函数内部的函数在外部不可访问,但是可以将其作为返回值来提供外部调用,例如:

funcgetMathFunc(funName : String) -> (Int, Int)->Int {

   func add(a : Int, b : Int) -> Int {return a + b}

   func min(a : Int, b : Int) -> Int {return a - b}

   func mul(a : Int, b : Int) -> Int {return a * b}

   func div(a : Int, b : Int) -> Int {return a / b}

   switch funName {

   case "add":

       return add

   case "min":

       return min

   case "mul":

       return mul

   case "div":

       return div

   default:

       return add

   }

}

println(getMathFunc("min")(10,3))            //输出7

82
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场