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)
}
Другие вопросы по тегам