我想给我的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;
答案 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)
}