斯坦福大學公開課:iOS8
網易空開課位址連結:斯坦福大學公開課:IOS8開發
github上字幕連結:字幕 百度網盤資源下載下傳連結:百度網盤
1.電腦完成
①Enter鍵及相關的代碼

//定義一個數組,用來當做棧儲存資料使用
var openStack = Array<Double>();
//enter用來執行進棧操作
@IBAction func enter() {
//設定重新開始輸入字元串
userIsInTheMiddleOfTypingANumber = false
//将value進棧
openStack.append(displayValue)
println("openStack = \(openStack)")
}
這裡面的displayValue定義其get和set方法:
//用來進棧的資料
var displayValue: Double{
get{
//将字元串轉換為double
return NSNumberFormatter().numberFromString(display.text!)!.doubleValue
}
set{
//将value轉換成字元串
display.text = "\(newValue)"
//設定重新開始輸入字元串
userIsInTheMiddleOfTypingANumber = false
}
}
其中NSNumberFormatter類中比較常用的兩個方法:
func stringFromNumber(number:NSNumber) -> String? NSNumber 轉換成String
func numberFromString(string:String) -> NSNumber? String 轉漢城 NSNumber
NSNumberFormatter().numberFromString(display.text!)!.doubleValue将字元串轉換為NSnumber,然後将NSNumber轉換為Double。
NSNumberFormatter()是用來初始化執行個體用的,這裡是隐式,表示用對象來引用其中的方法。
②加減乘除開根号運算
//用來進行運算
@IBAction func operate(sender: UIButton) {
//獲得目前按鈕的title
let operation = sender.currentTitle
//如果是中間輸入的數字
if userIsInTheMiddleOfTypingANumber {
//進棧
enter()
}
//switch判斷是什麼運算符,然後進行相應的運算
switch operation! {
case "×":performOperation(multiply)
case "÷":performOperation({(op1:Double, op2:Double)->Double in return op1 / op2;})
case "+":performOperation({(op1, op2) in op1 + op2;})
case "−":performOperation{$0 - $1}
case "√":performOperation{sqrt($0)}
default:break
}
}
//定義一個方法用來進行加減乘除運算,參數類型是一個方法:(Double, Double)->Double
private func performOperation(operation: (Double, Double)->Double) {
//棧中必須有兩個元素才能進行加減乘除的運算
if openStack.count >= 2 {
//把最後的兩個元素分别出棧,然後進行運算
displayValue = operation(openStack.removeLast(),openStack.removeLast())
enter()
}
}
//定義一個方法用來開平方,參數類型是一個方法:Double->Double
private func performOperation(operation: Double->Double) {
//棧中必須多于一個元素才能進行開平方
if openStack.count >= 1 {
displayValue = operation(openStack.removeLast())
enter()
}
}
①Swift中可以将一個方法作為另一個方法的參數:
performOperation(multiply)是将multiply方法作為performOperation方法的參數
②Swift中可以隐式的将一個方法作為另一個方法的參數
performOperation( {(op1:Double, op2:Double)->Doublein return op1 + op2;})
可以看到隐式方法作為參數的時候,要放在{}裡面,稱之為閉包
in後面表示方法内部的操作
③Swift有類型自動推導的功能,是以可以簡寫為:
performOperation( {(op1, op2)in op1 + op2;})
④Swift中編譯器會自動給方法中的參數傳一個預設值,第一個參數$0,第二個參數$1........
是以可以繼續簡化為:performOperation({ $0 + $1})
⑤Swift中如果一個方法是另外一個方法的最後一個參數,那麼可以将此方法放到原方法後面:
performOperation(){ $0 + $1}
方法中無參數了可以直接去掉():performOperation(){$0 + $1}
這裡要重點解釋一下方法重載問題:
Swift語言支援方法重載,OC不支援方法的重載:
func performOperation(operation: (Double,Double)->Double)
func performOperation(operation:Double->Double)
這兩個方法,名稱一樣,但是參數個數不一樣,屬于方法重載。如果按照課程上說的,直接這麼用會出現問題。
錯誤提示:Method 'perform' with Objective-C selector 'perform: ' conflicts with previous declaration with the same Objective-C selector
原因是:這個類繼承自UIViewController,也繼承NSObject,編譯器于是會按照OC中屬性的限制來編譯,是以就會報錯。
修改這個錯誤方法很簡單:
1.将兩個函數的名字取不一樣
2.用一個OC不支援的類型來阻止Swift語言的編譯器按照OC方式揭發這個錯誤。
2.MVC設計模式初探
解釋一下:
1.綠色的箭頭表示Controller對Model和View的直接引用。直接引用很簡單,隻需要在Controller中定義Model和View的執行個體變量。如果是通過storyboard或者xib定義View,則有IBOutlet。
2.View向Controller通信有三種方式(三個黃色箭頭):
①action對應target。例如UIButton中的Touch down,action(點選按鈕) target添加方法。
②設定View的delegate(代理),如UITabViewDelegate,在Controller中實作代理。
③設定View的data source(資料源), 如UITableViewDataSource。
這樣View達到了既能向Controller通訊,又不需要知道具體的Controller是誰是目的,這樣就和Controller解耦了。
3.Model圖形上面有一個信号塔,旁邊寫着Notification & KVO。Model主要是通過通知和鍵值監聽來和Controller通訊的。
4.Controller在MVC可以和View和Model互相通信,但是Model和View之間無法通信,用黃線隔開。
===============================================================================================================================
Demo:http://download.csdn.net/detail/misakahina/8824853