呃,为什么说是重拾呢,其实很早之前就接触过Swift,但是那时候还是1.x的版本,就记得!和?满天飞,看了下语法写了小项目,结果头昏脑涨,又转回OC了。
前几天忽然看到google考虑把Swift应用于开发安卓,不管是不是谣言吧,起码Swift发展速度相当之快,于是决定把Swift重新捡起来。
今天看了看基础语法,和记忆中差别还是挺大的。顺手写了个小项目,功能很简单,输入数字排序,可以快速排序也可以冒泡排序,一边结合项目一边熟悉语法吧。
编写时很多还是OC的思维,慢慢转变吧。
首先看下基本结构
首页是个UITableViewController,两个cell,快速排序和冒泡排序,点击cell进入DetailController,输入数字按排序按钮进行排序。
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
var cell = tableView.dequeueReusableCellWithIdentifier(reuseIdentifier)
if cell == nil
{
cell = UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: reuseIdentifier)
}
let str=dataArray[indexPath.row]
cell?.textLabel?.text=str
return cell!
}
首先我们看这一段代码,基本都能看出来就是创建cell的方法
在Swift中,常量用let,变量用var
cell最后为什么有个!号呢,这涉及到Swift中可选类型的概念。
使用可选类型(optionals)来处理值可能缺失的情况。可选类型表示:
- 有值,等于 x
或者 - 没有值
其实很容易理解,一个对象可能因为种种原因没有创建成功或者没值,就是nil,OC中向nil发送消息不会报错,但这也不是我们希望看到的。Swift中的可选表示它可能有值也可能没值,我们既然都要return一个cell显示出来,那么cell应该有值,所以我们用!告诉编译器这个cell一定有值,称之为强制解析
lazy var dataArray:[String]={
return ["快速排序","冒泡排序"]
}()
OC里有懒加载的概念,Swift中也有。
Swift中懒加载的关键字是lazy,非常直观好记,但这里有个注意点,你必须使用var关键字来定义延迟加载的属性,不能使用let关键字,因为常量必须在实例构建时赋值。
后面则是一个闭包,相当于block。闭包比较复杂,可以学习一下
闭包
反正这里的意思就是返回一个数组。
/**
选择排序要使用的方法
- parameter title: 控制器标题
*/
func chooseSortFunction(title:String){
switch title{
case "快速排序":
sortManager.quickSort(&numbers, left: 0, right: numbers.count-1)
case "冒泡排序":
sortManager.bubbleSort(&numbers)
default:
print("other")
}
}
这里注意一点,当匹配的 case 分支中的代码执行完毕后,程序会终止switch语句,而不会继续执行下一个 case 分支。
/**
快速排序算法
- parameter numbers: 数组
- parameter left: 左标
- parameter right: 右标
*/
func quickSort(inout numbers:[Int],left:Int,right:Int)
{
如果你想要一个函数可以修改参数的值,并且想要在这些修改在函数调用结束后仍然存在,那么就应该把这个参数定义为输入输出参数。
定义一个输入输出参数时,在参数定义前加 inout
关键字。
大概注意点就是那么多了
代码参见这里