Array / Stack содержит функцию
Я хотел бы дать моей структуре 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
В настоящее время компилятор выдает ошибку:
"Не могу вызвать"?? " со списком аргументов типа '(Array, BooleanLiteralConvertible)' "
1 ответ
Прежде всего, общий тип элемента T
должен соответствовать Equatable
так что вы можете сравнить данный элемент с элементами массива, используя ==
:
struct Stack<T : Equatable> : YourProtocols... {
filter
method принимает замыкание, которое проверяет каждый элемент массива:
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)
}