数组/堆栈包含函数
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)
}
我想为我的 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)
}