2016-04-18 4 views
1

私はこのanswerを見ましたが、私はSwiftを初めて使っているので、スタンフォードCS193のコースからうまくいくはずのコードに従っています。期待される結果が得られない候補はありません

これは、電卓の作成を含む練習からのものです。モデルでは、私は、これらの機能があります:私は、それが言うモデルで機能pushOperand/performOperationへ

@IBAction func operate(sender: UIButton) { 
    if userIsInTheMiddleOfTypingANumber { 
     enter() 
    } 
    if let operation = sender.currentTitle { 
     if let result = brain.performOperation(operation) { 
      displayValue = result 
     } else { 
      displayValue = 0 
     } 
    } 
} 

@IBAction func enter() { 
    userIsInTheMiddleOfTypingANumber = false 
    if let result = brain.pushOperand(displayValue) { 
     displayValue = result 
    } else { 
     displayValue = 0 
    } 
} 

次へ「復帰を評価」:コントローラで

private func evaluate() -> Double? { 
    let (result, remainder) = evaluate(opStack) 
    return result 
} 

func pushOperand(operand: Double) { 
    opStack.append(Op.Operand(operand)) 
    return evaluate() 
} 

func performOperation(symbol: String) { 
    if let operation = knownOps[symbol] { 
     opStack.append(operation) 
     return evaluate() 
    } 
} 

を、私はこれらの機能を持っています「評価する候補がなく、結果として期待される結果の型を生成する...」と表示され、コントローラの次の関数が操作/ Enterを押すと、「条件付き型の初期化子はオプションの型を必要とする...」という結果が表示されます"行。

これらのエラーを修正するにはどうすればよいですか(提示されたプレゼンテーションでコードが機能するため)。

答えて

3

エラーを修正するには、指定された関数の戻り値が必要です。

これは、関数の宣言の仕方は引数を設定することです(たとえば、引数が 'operand'で、型がDouble)、最後に関数が出力するものを指定する必要があるためですたとえばevaluate()の場合、Double?(オプションのDouble)の値を返します。戻り値の型を指定する方法は、引数が指定されている場合には、 ' - > YourType'という構文で始まります。

これは、関数の戻り値として変数を設定するとあなたはラインを持っている:

if let result = brain.performOperation(operation) { 
     displayValue = result 
    } else { 
     displayValue = 0 
    } 

機能performOperationしたがって、結果の値は常にN/Aの方法になるだろう、あなたはそれを指定していないので、それが値を返すことができることを知りません。コンパイラはそれを見ます。

ここで、if letエラーはあなたの関数の戻り値を指定していないので、戻り値がnil(オプション)であることも指定していません。 letが 'let'である変数の値をゼロにする必要がある場合。この試み解決するには

:ところで

func pushOperand(operand: Double) -> Double? { 
    opStack.append(Op.Operand(operand)) 
    return evaluate() 
} 

func performOperation(symbol: String) -> Double? { 
    if let operation = knownOps[symbol] { 
     opStack.append(operation) 
     return evaluate() 
    } else { 
     return nil 
    } 
} 
+1

は、私はまた、迅速なスタンフォード大学の講義をしました。彼らはすごい!電卓とグラフ電卓の割り当ては、あなたの頭を丸くするのが最も難しいですが、それを維持してください!これらの2つの後に学習曲線が簡単になります。 –

+0

ありがとう!モチベーション/ヘルプを本当に感謝します。力を維持し続ける。 – illuminatedtype

関連する問題