数组/堆栈包含函数

Array / Stack contains function

我想为我的 STACK 结构提供函数 contains(element: Element) returns 关于 var contents 是否包含提供的元素的布尔值。

struct Stack<T>: SequenceType, Equatable, Printable, DebugPrintable {
     typealias Element = T
     private var contents: [Element]
     var top: Int

     init(arrayLiteral elements: T...) {
          self.init(elements) }

     // easier initialization
     init<S: SequenceType where S.Generator.Element == Element>(_ sequence: S) {
          self.contents = [Element]()
          Swift.map(sequence) {self.contents[[==]] = true }
     }

     // returns TRUE if the Stack contains <T> 'element'
     func contains(element: Element) -> Bool {
         return contents.filter(element != nil) ?? false
     }

我希望能够定义一个新的 STACK 并像这样搜索其内容:

 var newStack: Stack = [5, 23, 45, 100]
 newStack.contains(45)                      // returns TRUE

目前编译器报错:

"Cannot invoke '??' with an argument list of type '(Array, BooleanLiteralConvertible)' "

首先,泛型元素类型T必须符合Equatable,这样 您可以使用 ==:

将给定元素与数组元素进行比较
struct Stack<T : Equatable> : YourProtocols... {

filter 方法采用闭包来测试每个数组元素:

let filtered = contents.filter({ [=11=] == element})

和returns一个新数组,只包含测试的元素("predicate") 产量 true。但是你不需要一个新的数组,你只想测试成员资格, 这可以通过 Swift contains() 函数来完成:

func contains(element: Element) -> Bool {
    return Swift.contains(contents, element)
}

顺便说一句,您的 init 方法无法编译。好像是从别的地方复制过来的 元素存储在字典中的集合类型。在这里你可以简单地 使用一个数组可以用一个序列初始化:

init<S: SequenceType where S.Generator.Element == Element>(_ sequence: S) {
    self.contents = Array(sequence)
}