0

STACK 構造体に、提供された要素が var コンテンツに含まれているかどうかについて bool を返す関数 contains(element: Element) を指定したいと思います。

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)' 型の引数リストを持つ "

4

1 に答える 1

3

まず、ジェネリック要素の型は、以下を使用して特定の要素を配列要素と比較できるようTに準拠する必要があります。Equatable==

struct Stack<T : Equatable> : YourProtocols... {

filterメソッドは、各配列要素をテストするクロージャーを取ります。

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

そして、テスト (「述語」) が生成する要素のみを含む新しい配列を返しますtrue。ただし、新しい配列は必要ありません。メンバーシップのみをテストしたい場合は、Swiftcontains()関数を使用して実行できます。

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)
}
于 2015-01-08T22:46:39.920 に答える