数组/堆栈包含函数

时间:2015-01-08 22:28:52

标签: swift generics swift-array

我想给我的STACK结构函数包含(element:Element)函数,它返回一个bool,知道var内容是否包含提供的元素。

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
     }

我希望能够定义一个新的STACK并搜索其内容,如下所示:

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

目前编译器给出错误:

&#34;无法调用&#39;&#39;&#39;使用类型&#39;(Array,BooleanLiteralConvertible)&#39;的参数列表&#34;

1 个答案:

答案 0 :(得分:3)

首先,通用元素类型T必须符合Equatable所以 您可以使用==

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

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

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

并返回一个新数组,其中只包含测试的元素(“谓词”) 收益率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)
}