2015-01-08 3 views
0

내 스택에 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 
    } 
나는 새로운 스택을 정의 할 수 그래서 같은 내용을 검색하고 싶은

:

var newStack: Stack = [5, 23, 45, 100] 
newStack.contains(45)      // returns TRUE 

는 현재 컴파일러의 오류 제공 :

"호출 할 수 없습니다 '를? ' 유형의 인수 목록 '(배열, BooleanLiteralConvertible)' "모든

+1

무엇이 문제입니까? 그리고 무엇이 문제입니까? – Antonio

+0

안토니오 - 죄송합니다. 추가하던 것을 잊어 버렸습니다 ... 하단에 추가했습니다. – Sean

+1

초기화 프로그램에 대한 문제가 있습니다. 빈 배열로 시작한 다음 들어오는 형식의 시퀀스를 해당 배열의 인덱스로 사용하려고합니까? Element를 숫자 형으로 제한하지 않았다면 작동하지 않는 것처럼 보입니다. 또한 빈 배열의 끝에서 즉시 벗어나 예외가 발생합니다. –

답변

3

첫째로, 일반 요소 유형 T는 배열 요소가 ==를 사용하여 지정된 요소를 비교할 수 있도록 것을 Equatable을 준수해야합니다

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

및 요소만을 포함하는 새로운 배열을 반환

filter 방법

struct Stack<T : Equatable> : YourProtocols... { 
각 배열 요소를 테스트하는 폐쇄 소요 ("술어") 은 true을 산출합니다. 그러나 당신은 당신은 단지 회원, 을 테스트 할 새로운 배열을하지 않아도 그는 스위프트 contains() 기능을 수행 할 수 있습니다
func contains(element: Element) -> Bool { 
    return Swift.contains(contents, element) 
} 

가, BTW 당신의 init 방법은 컴파일되지 않습니다. 그것은 요소가 사전에 저장되어있는 다른 콜렉션 유형에서 복사 된 것 같습니다. 여기서 간단히 배열을 시퀀스로 초기화 할 수 있습니다.

init<S: SequenceType where S.Generator.Element == Element>(_ sequence: S) { 
    self.contents = Array(sequence) 
} 
+0

감사합니다.이 작품은 – Sean

관련 문제