2016-06-10 38 views
0

我有必要在雨燕2.2堆栈数据结构是:雨燕2.2的Iterable堆栈数据结构

  • 通用
  • 具有传统的功能:
    • 推()
    • peek()
    • pop()
  • 除了具有以下功能:
    • 可转位
    • 可迭代

用来工作下面的代码,但现在我已经升级到2.2雨燕,代码不编译。错误消息是堆栈不符合SequenceType协议。我怀疑协议中增加了一些新功能,这些功能现在不需要在以前实施。

// 
// Stack.swift 
// 
// Created by kaydell on 7/30/15. 
// Copyright (c) 2015-2016 Kaydell Leavitt. All rights reserved. 
// 

import Foundation 

public class Stack<T>: SequenceType { 

    private var values: [T] = [] 

    public var count: Int { 
     return values.count 
    } 

    public subscript(i: Int) -> T { 
     return values[i] 
    } 

    public func push(t: T) { 
     values.append(t) 
    } 

    public func peek() -> T? { 
     let lastIndex = values.count - 1 
     if lastIndex <= -1 { 
      return nil 
     } else { 
      let t = values[lastIndex] 
      return t 
     } 
    } 

    public func pop() -> T? { 
     let lastIndex = values.count - 1 
     if lastIndex <= -1 { 
      return nil 
     } else { 
      let t = values.removeLast() 
      return t 
     } 
    } 

} 

我似乎无法弄清楚我需要从SequenceType协议实现什么,以使我的代码编译。

我喜欢Eclipse,在Java中编程时。如果一个Java接口需要实现方法,Eclipse会告诉你哪些方法需要实现,甚至可以根据请求为这些方法编写存根。

我使用的Xcode 7.3.1

确实雨燕2.2有一个堆栈数据类型的API?或者,有人可以帮我修复我的代码,以便它再次工作吗?

回答

2

斯威夫特不断变化这么快。如果你今天编写Swift 2代码,Swift 3出来后几个月就会过时。总之,这里是你如何在斯威夫特2

public class Stack<T>: SequenceType { 
    public typealias Generator = StackGenerator<T> 

    public func generate() -> Stack.Generator { 
     return StackGenerator(stack: self) 
    } 

    // your push(), pop(), peek(), etc... 
} 

public class StackGenerator<T>: GeneratorType { 
    public typealias Element = T 

    let stack: Stack<T> 
    var index: Int 

    init(stack: Stack<T>) { 
     self.stack = stack 
     self.index = stack.count 
    } 

    public func next() -> StackGenerator.Element? { 
     guard index > 0 else { 
      return nil 
     } 
     index -= 1 
     return self.stack[index] 
    } 
} 

使用方法做到这一点:

let stack = Stack<Int>() 
stack.push(1) 
stack.push(2) 
stack.push(3) 

for value in stack { 
    print(value) 
} 

我们只是希望,当一个出来的代码转换器可以自动将它升级到斯威夫特3。