private func evaluate(ops:[Op])-> (result:Double?, remainingOps:[Op]) {
if !ops.isEmpty {
var remainingOps = ops
let op = remainingOps.removeLast()
switch op {
case .Operand(let operand):
return (operand, remainingOps)
case .UnaryOperation(_, let operation):
let operandEvaluation = evaluate(remainingOps)
if let operand = operandEvaluation.result {
return (operation(operand), operandEvaluation.remainingOps)
}
case .BinaryOperation(_, let operation):
let op1Evaluation = evaluate(remainingOps)
if let operand1 = op1Evaluation.result {
let op2Evaluation = evaluate(op1Evaluation.remainingOps)
if let operand2 = op2Evaluation.result {
return (operation(operand1, operand2), op2Evaluation.remainingOps)
}
}
}
}
return (nil, ops)
}
func evaluate() -> Double? {
let (result, _) = evaluate(opStack)
return result
}
recursion
列印enum
private enum Op:Printable{
case Operand(Double)
case UnaryOperation(String, Double->Double)
case BinaryOperation(String, (Double, Double)->Double)
var description:String {
get {
switch self {
case .Operand(let operand):
return "(operand)"
case .UnaryOperation(let symbol, _ ):
return symbol
case .BinaryOperation(let symbol, _):
return symbol
}
}
}
}
遵從Printable protocol和定義description property
optional is enum
enumOptional<T> {
case None
case Some(T)
}
var x:String? = nil
x = Optional<String>.None
x = "hello"
x = Optional<String>.Some("hello")
var y = x!
switch x {
case .Some(let value):
y = value
case .None:
// raise an exception
break
}
playground的optional不再印出some
range搭配array
let array =["a","b","c","d"]
let subArray1 = array[2...3]
let subArray2 = array[2..<3]
println("(subArray1[1]) (subArray2[0])")
51.
String.Index
extension String :CollectionType {
/// A character position in a `String`
struct Index : BidirectionalIndexType, Comparable, Reflectable {
每個字佔據的記憶體⼤大⼩小不同