最近村花有在看Stanford University的公开课自学swift,因为是菜鸟级程序媛,所以遇到的困难会比较多,犯的小错误也比较多,而且swift是比较新的语言,网上资源也不及其他成熟的语言多,所以花的时间也比较多,但是我不会放弃学习的,因为要和村长一起并肩……“骑代马(码)”啊哈哈哈哈。ps:听说,这个笔记和SU的公开课一起看看更配哦~

话不多说,上码吧!

今天写的是一个Calculator的viewcontroller,所以import UIKit,与别的语言没什么大差别

[php]import UIKit
class ViewController: UIViewController {[/php]

下面的UIlabel有两种写法

第一种就是最常见的,直接在UIlabel后面加感叹号,直接解包UIlabel;

第二种就是UIlabel后面跟“?”,表示optional,接以下每一个继承这个UIlabel的display都要自己解包,

即每个display后面都要加上“!”;

[php]@IBOutlet weak var display: UILabel!

var userIsInTheMiddleOfTypingANumber = false

@IBAction func appendDigit(sender: UIButton) {

let digit = sender.currentTitle!

if userIsInTheMiddleOfTypingANumber{

display.text = display.text! + digit;

}else{

display.text = digit

userIsInTheMiddleOfTypingANumber=true

}
}

@IBAction func operate(sender: UIButton) {
let operation = sender.currentTitle!
if userIsInTheMiddleOfTypingANumber{
enter()
}[/php]

下面的performOperation的参数是一个函数operation,operation函数的参数是两个double,返回值是一个double,swift支持直接在调用函数时直接放一个函数作为参数,而且可以直接在传参的时候直接在括号内书写作为参数的函数代码
规则如下:
1.直接去掉函数名字,把大括号提前,并将大括号所在原位置用in代替:
minus(op1:Double,op2:Double) ->Double{return op2-op1}
变成:
{(op1:Double,op2:Double) ->Double in return op2-op1}
2.swift会自动推测参数以及返回值,而且会自己给出默认的参数名如$0,$1…之类的,所以如果有本例子一样函数调用函数的情况,直接写参数就可以了:
performOperation({$0 + $1})
3.像第2点那样写固然没错,但是如果所调用的函数并没有多余的参数了,比方说performOperation函数,就可以把括号去掉:
performOperation:{$0 + $1}
如果有多余的参数,就可以这样子写:
performOperation(多余的参数,{$0 + $1})
或者
performOperation(多余的参数){$0 + $1}
然后计算过程的代码就变的非常简洁而且具有可读性,很直观就可以看出参数和采用的计算符号。
这个就是闭包

[php]switch operation{
case "+":performOperation {$0 + $1}
case "-":performOperation {$1 – $0}
case "×":performOperation {$0 * $1}
case "÷":performOperation {$1 / $0}
case "√":performOperation {sqrt($0)}
default:break
}
}
[/php]

有认真看公开课的并且有跟着一起写程序的同学应该会发现,在跟着先生写performOperation函数的时候会抱一个查了很久都查不出来的bug:Method ‘performOperation’ with Objective-C selector ‘performOperation:’ conflicts with previous declaration with the same Objective-C selector;当我直接声明performOperation函数的时候,就会报这个错,原因是这个viewcontroller是继承于UIviewcontroller的,而UIveiwcontroller是oc里面的类,oc不支持函数的overloading,即同样的函数名,所以必须加上private。
然后我顺藤摸瓜搜了下下,swift里面一般有这三种访问控制(Access Control):private,internal,public。
private:只有所在的单个swift文件里使用
internal:默认的,可写可不写,表示在整个模块里可以使用,如果是开发app,就可以在整个app里使用。
public:无控制使用。

[php]private func performOperation(operation: (Double,Double) ->Double){
if operandStack.count>=2{
displayValue = operation(operandStack.removeLast(),operandStack.removeLast())
enter()
}
}
private func performOperation(operation: Double ->Double){
if operandStack.count>=1{
displayValue = operation(operandStack.removeLast())
enter()
}
}
var operandStack = Array<Double>()
@IBAction func enter() {
userIsInTheMiddleOfTypingANumber = false
operandStack.append(displayValue)
print("\(operandStack)")
}

var displayValue: Double {
get{
return NSNumberFormatter().numberFromString(display.text!)!.doubleValue
}

set{
display.text = "\(newValue)"
userIsInTheMiddleOfTypingANumber = false
}
}
}
[/php]

和我一样刚学swift可以试试把框框里的程式码放到Xcode里试试哦~

今天就写到这里咯,学习之路漫漫,加油吧~