现在要开始学习编写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
}
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})
case "+": performOperation({$0 + $1})
更酷的是,如果你的参数是最后一个参数,在这个例子当中,performOperation只有一个参数变量,所以自然是最后一个,那么我们可以将它拿出来,改写成:
case "+": performOperation(){$0 + $1}
这里需要注意的是,如果performOperation的参数不只一个,那么在最后一个参数前面的参数需要写到括号以内!如果这里只有一个参数,那么我们还可以直接将括号删除,变成:
case "+": performOperation {$0 + $1}
在最后额外提一句,在swift当中使用switch语句的时候,如果判断结果相等,执行完后面的语句之后会自动跳出,不需要像C++一样人工写break;
swift是不是很酷呢,这样我们就可以得到非常简洁的代码,并且可读性非常的强!