2016-06-12 29 views
11

我正在使用Swift中的filter()方法,但遇到了我在操場中似乎無法重現的問題。Swift結束:無法將類型'(_) - > Bool'的值轉換爲預期的參數類型

編輯:上傳實例項目位置:https://www.dropbox.com/s/5ce5uyxnpb0mndf/WeirdSwifty.zip?dl=0

我有一個Card結構包含一個CardType枚舉:

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

    enum CardType { 
     case Red 
     case Black 
    } 
} 

而一個Player類維護這些Card項目的數組:

class Player { 
    var hand : [Card] 

    init() { 
     hand = ... 
    } 

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

然而,無論我怎麼試圖格式化這個閉包,Xcode都會拋出一個錯誤。我甚至讓Xcode的自動完成關閉簽名/身,想着我有一個語法錯誤,但它一直重新創建相同的(正確嗎?)的方式:

enter image description here

我也試着編輯Xcode中什麼自動生成並提供了一個簡單的版本,但沒有成功:

enter image description here

同理:

enter image description here

正如我所提到的,我無法在一個簡單的操場示例中重現此操作,但我無法縮小在我的主項目中導致問題的實際

這是我的項目中唯一的錯誤,如果我註釋掉包含filter()調用的方法,它會正確構建。

這個錯誤是其他一些實際問題的常見紅鯡魚嗎?

注:使用的Xcode 7.3.1(7D1014)

+0

嘗試給卡顯式類型:'return hand.filter({(card:Card) - > Bool in return card.type == .Red })' – vacawama

+2

你的代碼對我來說編譯得很好......也許嘗試清理你的生成文件夾? – Hamish

+1

難道你沒有在同一範圍內的其他地方定義'card'或'Card'嗎?代碼也適合我編譯。 – Sulthan

回答

17

的薄片狀的東西與斯威夫特的類型推斷happing。給card一個明確的類型,它會起作用。

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

你不需要返回類型或返回:

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

注:該作品也:

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

完全指定.Red枚舉值可以解決問題,以及:

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

在評論中提到,如果將Card的定義移動到與過濾器相同的文件中,它就會起作用。實際上,如果將CardType枚舉的定義從Card中劃分出來,並且只將CardType移動到帶有過濾器的文件中,它就會起作用。

+0

這樣做,謝謝 - 將會解決這個問題。 'return'也是沒有必要的,如果單個語句的返回值與閉包的期望返回類型相匹配,則推斷它爲''card.type == .Red}中的return hand.filter({(card:Card) )' –

+0

@CraigOtis它與編譯的順序有關。如果'Card'在與'Player'相同的文件中聲明,它就可以工作。 – Sulthan

+0

完全指定枚舉類型也適用! 'return hand.filter({$ 0.type == Card.CardType.Red})' – vacawama

相關問題