Swift学习笔记(一)

  学了一段时间的swift,感觉语法很简单,和oc比已经精简到极致了。但是回过头来写代码,还是写不出来。所以从现在起写下笔记,来记录我学习swift的点点滴滴。

  首先我参考的是苹果官方的书籍 《The Swift Programming Language》,还买了一本书,关东升的《Swift开发指南》

  学编程,第一句代码一般都是“hello world”。swift也不例外,开篇的第一句就是在屏幕上打印“Hello world”,和oc的日志输出不一样,打印语句变成了和Java一样的println。语句末尾可以不加分号,但是我看着好别扭,估计是强迫症吧

  还记得初次学编程打印完 Hello world后遇到的是什么吗?对,就是变量和常量。在Swift中,用let关键字来声明常量,用var关键字来声明变量。如果没有接触过类似的语言,短时间内还适应不过来。我记得在后台语言中见到过这样的声明方式,不用我们声明类型,由编译器自动推断类型。

 

 

 

1 var myVariable = 42
2 
3 myVariable = 50
4 
5 let myConstant = 42 //这是常量,一旦赋值不可更改

 

 

声明时类型是可选的,声明的同时赋值的话,编译器会自动推断类型。如果初始值没有足够的信息,那么就需要在变量后声明类型:

 

1 let implicitInteger = 70
2 
3 let implictiDouble : Double = 70

 

 

在Swift中类型关键字首字母是大写,一时半会还适应不过来

 

接着就说到了类型转换,Swift中值永远不会被隐式转换

 

1 let label  = “hello”
2 
3 let width = 94
4 
5 let widthLabel = label + String(width)

 

 

首先用String()这个方法把整型变量转换成了字符串,然后用一个“+”连接两个字符串。而且和oc不同的是,字符串不用加“@”符号了。为什么我越看越像Java的语法?

 

这个是通过类型的类方法转换的,还有一种更简单的方式把值转换成字符串:

 

1 let apples = 3
2 
3 let appleSummary = “I have \(apples + 2) apples”

 

 

把值写到括号中,前面加一个反斜杠

 

突然想到一点

实际上,我们的变量名可以这样

 

1 let 🐶 = “狗”
2 
3 let 猫 = “🐱”

 

 

虽然可以这样写,但是不推荐。个人看起来比较别扭。

 

 

接着就要说到数组和字典了。数组是一串有序的相同类型元素构成的集合,相信这些概念都已经学过N遍了,这里主要是说一下Swift的语法。创建数组和字典:

 

 1 var list = [“1”, “2”, “3”]
 2 
 3 //or
 4 
 5 var array = String[]() //创建一个空数组,用初始化语法
 6 
 7 //字典类似
 8 
 9 var value = [“name”: “llt”, “age”: “1”] //非常不习惯字典用方括号
10 
11 var myDictionary = Dictionary<String, String>

 

 

既然说到了数组,那么顺便说一下数组的修改

追加数组元素可以使用数组的append方法或者+操作符实现。插入元素可以使用数组的insert方法实现。删除元素可以使用数组的removeAtIndex实现

 

1 var studentList : [String] = [“张三”, “李四”]
2 
3 studentList.append(“王五”)
4 
5 studentList += [“董六”]
6 
7 studentList.insert(“llt”, atIndex:student.count)
8 
9 studentList.removeAtIndex(0)

 

 

写习惯了oc代码,习惯了用[]调用方法,这样的写法还不是很喜欢

 

有了数组,当然要说一下数组的遍历,以前常见的循环和普通的for-in就不说了,来看看swift比较实用的:

 

 

1 for   (index, value) in enumerate(studentList)
2 
3 {
4 
5 }

 

 

enumerate函数可以去取出数组的索引和元素,其中(index, value)是元组类型

 

数组就到这里吧。再来看看字典

 

1 var studentDictionary = [100 : “张三”, 101 : “李四”]
2 
3 studentDictionary[102] = “王五” //添加键值对
4 
5 studentDictionary.removeValueForKey(100) //删除键值对
6 
7  //替换
8 
9 studentDictionary.updateValue(“李四”, forKey:102)

 

 

很经典的增删改查,学习编程是学习思维。不管语法怎么变,思路不变。现在的编程语言万变不离其宗

 

字典的遍历

1 for (studentID, studentName) in studentDictionary
2 
3 {
4 
5 }

 

 

还可以单独遍历键或者值

1 for studentID in studentDictionary.keys      //值是values
2 
3 {
4 
5 }

 

 

比oc方便很多,oc中要想遍历这些还要依靠数组来做

 

 

嗯,基本的就说到这里。

 

 

  通常的教材里,控制流放在第三章

  什么是控制流呢,就是if、switch、while、for 等等

  这些就不细说了,大致一样。

  条件语句可以不加括号了,switch不用加break了,switch支持任意类型的数据以及各种比较操作了。等等

  还有一点。swift里有了跳转语句,什么是跳转语句呢,在c里面学过,就是在一行语句前,加一个标签,需要的时候跳转到这条语句执行。

  再有一点。switch中如果不需要自动跳出怎么办。比如说计算一年当中的第几天,那么要加一个关键字,fallthrough。和break正好相反。

 

   接下来就是一大重点了,是什么呢,是函数

  用func来声明一个函数。这也就算了,居然用->指定函数的返回值,受不了了。不知道是我读书少还是。。。

  来看一个最简单的函数吧

1 func test(name: String, age: Int) -> String
2 
3 {
4 
5     returen “我叫 \(name)  我今年 \(age)  岁了”
6 
7 }

 

 

如果我们定义的函数有很多参数,它们由具有相同的数据类型,我们没有清晰的帮助说明,调用者很难知道参数的含义是什么。

看上面的那个函数名 name 和age只能在函数的内部使用,叫做局部参数名,我们还可以为每个参数提供一个可以在函数外部使用的名称,成为外部参数名。

1 func test(N name : String, A age:Int) -> String
2 {
3 
4 }

 

如果我们提供了外部参数名,那么在调用函数时,必须使用外部参数名,所以N和A不能省略。

有时候内部参数名也能很好的体现出含义,那么我们就让外部参数名和内部参数名一样。

1 func test(#name:String, #age:Int)-> String
2 {
3 
4 }
5 println(test(name:”llt”, age:1))

 

嗯。再也找不回写oc文章那种感觉了

参数如果不传值会怎么办呢,在swift里,有参数默认值

1 func makeCoffee(type : String = “卡布奇诺”) -> String
2 {
3 
4 }

 

 

调用这个函数的时候,如果没有传参数的话。那么参数值默认是“卡布奇诺”

 

函数的参数可以是可变的值,返回值也是可变的

 1 fun sum(numbers: Int …) -> (Int, Int ,Int )
 2 {
 3     var total : Int = 0
 4 
 5     for number in numbers
 6     {
 7 
 8     }
 9 
10     returen (1, 2, 3)
11 
12 }

 

 

就是这样用的,并不难。难的在后面

 

 

 

  学习C语言的时候,函数参数有两个形式,一种是值传递,一种的指针地址传递

  理解了就不难,什么是值传递呢,就是给函数传参的时候,传的时一个副本,在函数中不影响原始数据,而引用类型就是把本身传过去,也就是所谓的地址,这样在函数中可以改变原始数据

  在swift中,只有类是引用类型,其他的时值类型。如果要将一个值类型参数作为引用传递,那么就要用到一个关键字,inout

1 func test(inout value: Double)
2 {
3 
4 }

 

 

 

在C语言里面,是不可以嵌套函数的。

swift里,函数可以当做返回值,也可以当做参数,主要还可以嵌套

1 func test(list:Int[] -> Bool) -> Bool
2 {
3     func add()
4     {
5 
6     }
7     add()
8     
9 }

 

 

 

感觉还是block好用一些。swift里的闭包好像是通过函数实现的

 

 

那么下次就来说是闭包吧。也许是初次见面,不是很喜欢这种方式

 

posted @ 2014-10-31 14:58  木子丶礼  阅读(629)  评论(0编辑  收藏  举报