Swift语言学习笔记(二)

原创 2017年01月03日 19:46:26


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

版权声明:本文为博主原创文章,未经博主允许不得转载。

C语言学习入们到精通之学习笔记(一)

为什么我通过博客的形式与大家分享我的学习笔记     对于c语言的学习已经有快3年之久了,对于学习嵌入式的我看来,C是我们的根本也就是我们的核心知识点,想学习好嵌入式就必须精通C语言。在一年之前我对...
  • love131452098
  • love131452098
  • 2016年05月29日 14:39
  • 1380

kafka学习笔记(2)

kafka的经典问题有这几个: 1.kafka节点之间如何备份? 2.kafka消息是否会丢失?为什么? 3.kafka最合理的配置是什么? 4.kafka的leader选举机制是什么? 5...
  • m0_37587447
  • m0_37587447
  • 2017年11月21日 15:37
  • 21

PCIe 学习笔记(二)

pci note 2 -v0.1 2014.11.18 *** draft  本文继续pci note 1, 介绍pci_create_root_bus函数, 内核版本为3.18-rc1 ...
  • scarecrow_byr
  • scarecrow_byr
  • 2014年12月01日 22:19
  • 1721

《从零开始学Swift》学习笔记(Day 40)——析构函数

原创文章,欢迎转载。转载请注明:关东升的博客 与构造过程相反,实例最后释放的时候,需要清除一些资源,这个过程就是析构过程。在析构过程中也会调用一种特殊的方法deinit,称为析构函数。析构函数dein...
  • tonny_guan
  • tonny_guan
  • 2015年11月25日 10:28
  • 1973

Go语言学习笔记10

6 程序测试和文档 6.1 程序测试 1.功能测试 2.基准测试
  • u012855229
  • u012855229
  • 2016年07月14日 07:42
  • 2076

网络编程学习笔记整理(二)

摘录笔记 《TCP/IP高效编程 改善网络程序的44个技巧》socket的创建函数int socket (int domain,int type, int protocol)参数说明protocol需...
  • stecdeng
  • stecdeng
  • 2017年02月23日 14:47
  • 187

密码学学习笔记

1.流密码每次加密数据流的一位或一个字节,分组密码是将一个明文分组作为整体加密并且通常得到的是与明文等长的密文分组。 2.现在使用的大多数对称分组加密算法都是基于Feistel分组密码结构的。...
  • u011130578
  • u011130578
  • 2015年12月22日 13:57
  • 794

Unity3D之Mecanim动画系统学习笔记(三):Animation View

动画组件之间的关系 我们先看一张图: 这里我们可以看到,我们在GameObject之上绑定的Animator组件是控制模型进行动画播放的。 而其属性Controller则对应一个Anim...
  • cbbbc
  • cbbbc
  • 2017年02月19日 18:20
  • 317

Netty4学习笔记(一) 基础篇

在开始学习Netty之前,我们先对Unix系统常用的I/O模型进行介绍,然后对Java的I/O历史演进历史进行简单的说明。Linux 网络I/O模型简介Linux内核将所有外部设备都看做一个文件来操作...
  • FX_SKY
  • FX_SKY
  • 2016年03月15日 01:38
  • 6219

比特币源码学习笔记(二)

第二章 本章继上一章交易创建之后介绍比特币客户端序列化数据的过程。 比特币客户端所有的序列化函数均在serliaze.h中实现。其中,CDataStream类是数据序列化的核心结构。 CDataStr...
  • g2com
  • g2com
  • 2017年03月22日 07:57
  • 1286
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Swift语言学习笔记(二)
举报原因:
原因补充:

(最多只允许输入30个字)