学习stanford公开课 Developing iOS8 Apps with Swift 笔记(一)

来源:互联网 发布:云数据加密传输运营商 编辑:程序博客网 时间:2024/05/24 05:23

现在要开始学习编写ios应用,所以开始学习swift。看到网上很多代码都是用objective-c写的,我自己没有什么objective-c的经验,干脆直接用swift来学习编程好了,省去了学习objective-c的过程。

我自己只对C++比较熟悉,但是上手swift觉得其实还是挺容易的。


首先要注意swift有一个optional的类型。什么,你不知道optional类型,在编写swift的时候经常可以看到?或者是!。对于?就是一个optional的类型,对于optional只能有两个值,一个是nil,一个是非nil。在xcode里面编写的时候按optional键然后鼠标左击相应的变量会出现tutorial,在里面经常可以看到?,也就是optional类型的,对于string?这种类型,如果改成string!,那么就是string类型。这里需要注意一点:

swift是强类型语言,在非optional类型的时候如果该值为nil,那么整个程序会崩溃!这点事需要注意的!


接下来来说一个有趣的使用方法,现在我希望在ios上面写一个计算器小程序,那么肯定需要各种操作,加减乘除等等等等。如果每一个操作都写成类似的

switch operation{case "+":case "-":case "*":case "/":default :break}


如果我们对每一个case操作后面都写成

        switch operation{        case "+":            if operandStack.count >= 2{                displayValue = operandStack.removeLast() + operandStack.removeLast()                enter()            }        case "-":            if operandStack.count >= 2{                displayValue = operandStack.removeLast() - operandStack.removeLast()                enter()            }        case "*":            if operandStack.count >= 2{                displayValue = operandStack.removeLast() * operandStack.removeLast()                enter()            }        case "/":            if operandStack.count >= 2{                displayValue = operandStack.removeLast() / operandStack.removeLast()                enter()            }        default :break

可以达到我们需要的功能,但是可读性非常差,这不是一个好的程序员应该有的代码习惯,我们接下来对上面这段代码进行改进,我们可以发现其实每一段执行的函数几乎不变,那么我们可以通过写一个函数来实现在个功能。在swift当中,函数是可以当成一个变量传入另一个函数的(我在C++当中从来没有这样用过,但是貌似C++也可以实现这个功能?)这样做的好处是,可以提高代码的可读性,也令我们的代码简化了不少。

switch operation{        case "+": performOperation(plus)        case "-": performOperation(minus)        case "*": performOperation(multiply)        case "/": performOperation(divide)        default :break        }                func performOperation(operation:(Double, Double) ->Double){            if operandStack.count >= 2{                displayValue = operation(operandStack.removeLast(),operandStack.removeLast())                enter()            }        }        func plus(op1: Double, op2: Double) ->Double{            return op1 + op2        }


这样修改之后虽然可读性提高了,但是代码量其实无形当中并没有降低,反而更高了,因为我们接下来还需要完成minus, multiply和divide三个函数,那么我们是否可以继续精简呢?答案是可以的,在swift当中,可以支持闭包(closure)。

实际上,在swift当中,将函数当作参数传递是非常常见的,所以我们可以这样改写

case "+": performOperation(plus)
<pre name="code" class="plain">func plus(op1: Double, op2: Double) ->Double{            return op1 + op2        }

变成
case “+”: performOperation({(op1:Double, op2:Double) ->Double in return op1 + op2})
这样就可以直接将一个函数放到参数的位置。但是我们还可以做的更好,因为swift的type inference做的非常好,可以从上下文当中找到变量的类型,所以我们在上面调用的时候可以省略各个变量的类型,也可以直接省略返回值的类型,变成如下:

case "+": performOperation({(op1,op2) in return op1 + op2})

因为我们知道performOperation将两个double类型的变量作为参数传入,并且返回一个Double类型的值,所以在上面我们是可以直接省略参数类型和返回类型的。

但是我们还可以使这个更好,因为swift知道performOperation返回某一种类型,所以我们并不需要return这个关键字

case “+”:performOperation({(op1,op2) in op1 + op2})


swift并不是必须要为参数变量取名字的,也就是我们并不需要为参数命名为op1和op2,如果没有为他们命名,可以用$0 $1来代替,所以我们可以将上面的语句改成:

case "+": performOperation({$0 + $1})
更酷的是,如果你的参数是最后一个参数,在这个例子当中,performOperation只有一个参数变量,所以自然是最后一个,那么我们可以将它拿出来,改写成:

case "+": performOperation(){$0 + $1}
这里需要注意的是,如果performOperation的参数不只一个,那么在最后一个参数前面的参数需要写到括号以内!如果这里只有一个参数,那么我们还可以直接将括号删除,变成:

case "+": performOperation {$0 + $1}


在最后额外提一句,在swift当中使用switch语句的时候,如果判断结果相等,执行完后面的语句之后会自动跳出,不需要像C++一样人工写break;


swift是不是很酷呢,这样我们就可以得到非常简洁的代码,并且可读性非常的强!






0 0
原创粉丝点击