Stanford CS 193 p iOS開発教室作業(1)

5191 ワード

第一課Logistics,iOS 8 Overviewが行われた.第二課More Xcode and Swift,MVC.2課の学習後、初めての授業の宿題があり、計算機DEMOの機能を完備することを要求した.
基本的な要件
  • 自動レイアウト
  • を実現
  • は小数点を実現する.のキー機能
  • は「sin」,「cos」,「π」の演算
  • を実現する.
  • 履歴ボックス
  • を作成する.
  • クリアボタン「C」
  • を追加
    追加の要件
  • 返却キー機能
  • を実現する.
  • 等号"="
  • を追加
  • プラスマイナス変換ボタン「+/-」
  • を追加
  • 最適化インタフェース
  • 2015年11月30日
    「sin」「cos」「π」の演算を実現
  • 「sin」、「cos」は、前の「√」演算の方法で
  • を直接実現することができる.
  • 「π」の演算方法はpreform Operation方法を書き換えて実現する必要があり、具体的には以下のpreform Operation 3の方法とcase「π」:performOperation 3(M_PI)
  • を参照する.
        @IBAction func operate(sender: UIButton) { //         
            let operation = sender.currentTitle!  //     
            if userIsInTheMiddleOfTypingANumber { //     enter     ,         "6  enter  6  enter  X"    36,     "6  enter  6  X"
                enter()
            }
            switch operation {  //  switch          
            case "×" :performOperation {$0 * $1}  //        
            case "÷" :performOperation {$1 / $0}  //  $1       ,$0      ,        $1 /- $0               
            case "+" :performOperation {$0 + $1}
            case "−" :performOperation {$1 - $0}
            case "√" :performOperation2 {sqrt($0)}
            case "sin" :performOperation2 {sin($0)}
            case "cos" :performOperation2 {cos($0)}
            case "π" :performOperation3(M_PI)
            default: break
            }
        }
    
        func performOperation(operation: (Double,Double) -> Double) {
            if operandStack.count >= 2 {
                displayValue = operation(operandStack.removeLast(), operandStack.removeLast()) //               ,     
                enter()
            }
        }
        
        func performOperation2 (operation: Double -> Double) {
            if operandStack.count >= 1 {
                displayValue = operation(operandStack.removeLast())
                enter()
            }
        }
        
        func performOperation3(operation: Double) {
            displayValue = operation
            enter()
        }
    

    2015年12月2日
    「C」クリアボタンの機能を実現し、他の機能は一時的に学習レベルが完璧に解決できないため、まず次の学習を継続し、その後未完成の機能を実現する.
  • まずbuttonをドラッグし、Actionイベント
  • を作成します.
  • 解決構想は:1.演算スタックを空にする2.display:Labelを復元する3.ユーザがfalse
  • として入力かどうかを設定する.
        @IBAction func clearButton(sender: UIButton) {
            operandStack.removeAll()
            display.text = "0"
            userIsInTheMiddleOfTypingANumber = false
        }
    

    2015年12月3日
    「←」削除ボタンの機能を実現
  • 解決策:まずユーザが入力(display.text?.characters.connt>0 or==0)したかどうかを判断し、ゼロより大きい場合は最下位(display.text=String((display.text!)を削除する.characters.dropLast())、入力されていない場合はデフォルト値0(display.text="0")、最後にuserIsInTheMiddleOfTypingANumber=false
  •     //      
        @IBAction func backSpace(sender: UIButton) {
            if display.text?.characters.count > 0 {
                display.text = String((display.text!).characters.dropLast())
            }
            if display.text?.characters.count == 0 {
                display.text = "0"
                userIsInTheMiddleOfTypingANumber = false
                
            }
        }
    

    プラスマイナスボタン変換機能を実現
  • 解決構想:1.この機能は、labelに表示するスタックに入れるだけでなく、演算方法としてスタック内の正負号変換を実現する.2.labelを実現する現実は作成方法によって実現することができ、まず「-」のマイナス記号があるかどうかを判断し、ない場合は前に追加し、ある場合は削除する.
  • if display.text!.hasPrefix("−") {
                display.text?.removeAtIndex(display.text!.startIndex)
            } else {
                display.text = "−" + display.text!
            }
    

    3.スタック内の正負の符号変更を実現するには演算方法を追加する必要があり、func operate()で「+/−」buttonをクリックしたかどうかを判断し、クリックした場合changeDisplaySign()を実現し、switchにcase「+/−」を加える:performOperation 2{−$0}コードは以下の通りである.
        @IBAction func operate(sender: UIButton) { //         
            let operation = sender.currentTitle!  //     
            if userIsInTheMiddleOfTypingANumber { //     enter     ,         "6  enter  6  enter  X"    36,     "6  enter  6  X"
                if operation == "+/−" {
                    changeDisplatSign()
                    return
                }
                enter()
            }
            switch operation {  //  switch          
            case "×" :performOperation {$0 * $1}  //        
            case "÷" :performOperation {$1 / $0}  //  $1       ,$0      ,        $1 /- $0               
            case "+" :performOperation {$0 + $1}
            case "−" :performOperation {$1 - $0}
            case "√" :performOperation2 {sqrt($0)}
            case "sin" :performOperation2 {sin($0)}
            case "cos" :performOperation2 {cos($0)}
            case "π" :performOperation3(M_PI)
            case "+/−" :performOperation2 { -$0 }
            default: break
            }
        }
    
        func performOperation2 (operation: Double -> Double) {
            if operandStack.count >= 1 {
                displayValue = operation(operandStack.removeLast())
                enter()
            }
        }
    
        //          
        func changeDisplatSign() {
            if display.text!.hasPrefix("−") {
                display.text?.removeAtIndex(display.text!.startIndex)
            } else {
                display.text = "−" + display.text!
            }
        }