在堆栈数据结构中快速查找元素4

时间:2018-12-11 02:57:37

标签: swift

如果在Ray Wenderlich处发现了此堆栈数据结构,并且效果很好:

public struct Stack<T> {
  fileprivate var array = [T]()

  public var isEmpty: Bool {
    return array.isEmpty
  }

  public var count: Int {
    return array.count
  }

  public mutating func push(_ element: T) {
    array.append(element)
  }

  public mutating func pop() -> T? {
    return array.popLast()
  }

  public var top: T? {
    return array.last
  }
}

我想添加另一种在堆栈中查找元素的方法,以便我不会尝试多次添加元素。例如,我要保留一堆ViewController。

var vcStack = Stack<UIViewController>()
vcStack.push(VC1)
vcStack.push(VC2)

如果输入的VC存在(或不存在),我希望能够查询Stack并返回一个布尔值,如下所示:

if vcStack.hasElement(VC1) {
  //do something
}

这是伪代码-Swift 4代码是什么?

public var hasElement(_ element: T): -> Bool {
    if array.contains(element){
        return true
    }else{
        return false
    }
}

2 个答案:

答案 0 :(得分:2)

如果您将Stack类定义为要求其元素符合Equatable

public struct Stack<T> where T: Equatable {

那么您的hasElement将是:

public func hasElement(_ element: T) -> Bool {
    return array.contains(element)
}

或者您可以将Stack声明为已保留,然后将hasElement添加到扩展名:

public extension Stack where T: Equatable {
    public func hasElement(_ element: T) -> Bool {
        return array.contains(element)
    }
}

这使您必须拥有一堆东西,但hasElement函数只有在Stack个值Equatable中才可用。

答案 1 :(得分:0)

struct MenuData {     让标题:字符串!     让imageName:字符串! }

MoreTV类:UITableView {

var aryMenu : [MenuData] = [MenuData(title: "My Profile".localized, imageName: "ic-user"),]

}