0

我想给我的 STACK 结构一个函数 contains(element: Element) ,它返回一个关于 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[$0] = true }
     }

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

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

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

目前编译器给出的错误是:

“不能调用'??' 带有类型为 '(Array, BooleanLiteralConvertible)' 的参数列表

4

1 回答 1

3

首先,通用元素类型T必须符合,Equatable以便您可以使用以下方法将给定元素与数组元素进行比较==

struct Stack<T : Equatable> : YourProtocols... {

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

let filtered = contents.filter({ $0 == element})

并返回一个新数组,其中仅包含测试(“谓词”)产生的元素true。但是你不需要一个新数组,你只想测试成员资格,这可以通过 Swiftcontains()函数来完成:

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)
}
于 2015-01-08T22:46:39.920 回答