2016-06-12 2 views
11

스위프트에서 filter() 메서드로 작업하고 있지만 놀이터에서 재생할 수없는 문제가 발생했습니다.스위프트 클로저 : '(_) -> Bool'유형의 값을 예상 인수 유형으로 변환 할 수 없습니다.

편집 : 업로드 여기 예제 프로젝트 : https://www.dropbox.com/s/5ce5uyxnpb0mndf/WeirdSwifty.zip?dl=0

나는 CardType 열거가 포함 된 Card 구조체가 :

struct Card { 
    var name = "" 
    var type : CardType 

    enum CardType { 
     case Red 
     case Black 
    } 
} 

그리고이 Card 항목의 배열을 유지하는 Player 클래스를 :

class Player { 
    var hand : [Card] 

    init() { 
     hand = ... 
    } 

    func redCards() -> [Card] { 
     return hand.filter({ (card) -> Bool in 
      return card.type == .Red 
     }) 
    } 
} 

그러나이 클로저를 어떻게 포맷하든 관계없이 Xcode에서 오류가 발생합니다. 난 엑스 코드 내가 구문 오류가 있었다 생각, 폐쇄 서명/몸을 자동으로 완성 할 수 있지만, 그것을 같은 (맞습니까?) 방법을 다시 유지 :

enter image description here

나는 또한 엑스 코드를 자동으로 생성하는 것을 편집을 시도했습니다 그리고 아무 소용, 간단한 버전을 제공 : 마찬가지로

enter image description here

:

enter image description here

내가 언급 한 것처럼 간단한 놀이터 예제에서 이것을 재현 할 수는 없지만 실제로는 을 내 기본 프로젝트의 문제으로 좁힐 수 없습니다.

이것은 내 프로젝트의 유일한 오류이며, filter() 호출을 포함하는 메서드를 주석 처리하면 제대로 빌드됩니다.

이 오류는 다른 실제 문제의 일반적인 청어입니까?

참고 : 엑스 코드 7.3.1 (7D1014) 스위프트의 타입 추론에 happing되는 flakey

+0

'return hand.filter ({(card : Card) -> Bool in return }}' – vacawama

+2

당신의 코드가 나에게 잘 컴파일된다. 빌드 폴더를 청소 해보십시오. – Hamish

+1

같은 범위에있는 다른 곳에 '카드'또는 '카드'가 정의되어 있지 않습니까? 코드가 나에게도 잘 컴파일됩니다. – Sulthan

답변

17

뭔가를 사용. card에 명시 적 유형을 지정하면 올바르게 작동합니다.

return hand.filter({ (card: Card) in card.type == .Red }) 

참고 :이 또한 작동합니다 완전히 .Red 열거 값을 지정

return hand.filter({ ($0 as Card).type == .Red }) 

뿐만 아니라 문제를 해결

return hand.filter({ (card: Card) -> Bool in return card.type == .Red }) 

당신은 반환 형식 또는 반환을 필요로하지 않습니다 :

return hand.filter({ $0.type == Card.CardType.Red }) 

Card의 정의를 필터와 동일한 파일로 옮기면 작동한다는 의견에 언급되었습니다. 사실 CardType 열거 형의 정의를 Card에서 분리하고 CardType을 필터가있는 파일로 옮기면 작동합니다.

+0

그게 그랬어, 고마워 - 문제가 레이다. 'return'도 필요하지 않습니다. 하나의 명령문이 예상되는 클로저의 리턴 타입과 일치하는 리턴 값을 가지고 있다고 추론됩니다 :'return hand.filter ({(card : Card) in card.type == .Red})' –

+0

@CraigOtis 컴파일 순서와 관련이 있습니다. 'Card'가'Player'와 같은 파일에서 선언되면 작동합니다. – Sulthan

+0

열거 형을 완전히 지정하면 효과가 있습니다! 'return hand.filter ({$ 0.type == Card.CardType.Red})' – vacawama

관련 문제