2015-04-29 26 views
0

我跟隨斯坦福大學iOS課程,我有一個問題,我相信是與最近更新有關。下面是一段代碼:最近Swift更新關於變異結構的變化?

func evaluate(ops: [Op]) -> (result: Double?,remainingOps: [Op]) { 
    let op = ops.removeLast() //*I thought ops was immutable?   
} 

在視頻方面,教師獲得,說你不能這樣做,因爲OPS是不可改變的錯誤。這是完全有道理的,但是當我嘗試輸入時,我不會收到錯誤。這是什麼意思?這是最近一次Swift更新中傳入方法的結構是否可變的變化?有任何想法嗎?在視頻中,教師通過創建一個實例變量來解決問題,該實例變量是操作的副本,但不再出現錯誤,並且想知道原因。

編輯當在操場上輸入這個信息時,我仍然收到錯誤信息,但我沒有收到我的Swift文件。這裏的參考文件是迄今爲止的整個文件。有任何想法嗎?我只是想了解這裏發生了什麼:

import Foundation 

class CalculatorBrain { 

    private enum Op { 
     case Operand(Double) 
     case UnaryOperation(String,Double -> Double) 
     case BinaryOperation(String, (Double,Double) -> Double) 
    } 

    private var opStack = [Op]() 

    private var knownOps = [String:Op]() 

    init() { 
     knownOps["×"] = Op.BinaryOperation("×",*) 
     knownOps["÷"] = Op.BinaryOperation("÷") { $1/$0 } 
     knownOps["+"] = Op.BinaryOperation("+",+) 
     knownOps["−"] = Op.BinaryOperation("−") { $1 - $0 } 
     knownOps["^"] = Op.BinaryOperation("^") { pow($1,$0) } 
     knownOps["√"] = Op.UnaryOperation("√",sqrt) 
     knownOps["sin"] = Op.UnaryOperation("sin") { sin($0) } 
     knownOps["cos"] = Op.UnaryOperation("cos") { cos($0) } 
     knownOps["tan"] = Op.UnaryOperation("tan") { tan($0) } 

    } 

    func evaluate(ops: [Op]) -> (result: Double?,remainingOps: [Op]) { 
     if !ops.isEmpty { 
      let op = ops.removeLast()//*Error should appear here but does not 

     } 
     return (nil,ops) 
    } 

    func evaluate() -> Double? { 

    } 

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

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

你使用的是什麼版本的Xcode?我在Xcode 6.3.1上,並且我剛剛嘗試了在Playground中創建Op結構的func,並且我得到以下錯誤:「不可變值類型'[Op]'只有名爲'removeLast'的變異成員'「 – ubersnack

+0

請參閱上面的編輯 –

+0

原來@Salihcyilmaz在下面提出了一個錯誤。我重新啓動Xcode,現在它出現一個錯誤。 –

回答

1

我剛剛檢查過,看它是否隱含地使數組的副本。不,不是的。你的xCode存在錯誤,我想。請重新啓動xCode並重試。轉到實用工具欄,將光標移動到代碼中的ops數組上。你作爲一種類型觀察到什麼? "error type"還是別的?您也可以通過按opt進行檢查並單擊該變量。

+0

正如你所建議的那樣,我重新啓動了Xcode,現在它顯示爲錯誤。 –

0

我剛剛與拋出了一個錯誤以下游樂場代碼(Xcode中6.3.1)試過這個現在:

//: Playground - noun: a place where people can play 

import UIKit 
import XCPlayground 

//: Developing iOS 8 Apps with Swift 3. Applying MVC 40 minutes in 

enum Op { 
    case Operand(Double) 
    case UnaryOperation(String, Double -> Double) 
    case BinaryOperation(String, (Double, Double) -> Double) 
} 

var knownOps = [String:Op]() 

knownOps["x"] = Op.BinaryOperation("x", *) 

// by putting let for the parameter we are declaring ops as immutable 
// the default is for each parameter is let 
func evaluate(ops: [Op]) -> (result: Double?, remainingOps: [Op]) { 
    if !ops.isEmpty { 
     let op = ops.removeLast() // Immutable value of type '[Op]' only has mutating members named 'removeLast' 
    } 
    return (nil, ops) 
} 

如果我改變evaluate(ops: [Op])evaluate(var ops: [Op]),同爲視頻它刪除錯誤。我在想,你正在使用的Xcode項目有什麼問題 - 也許嘗試重新啓動Xcode(舊的關閉)?