2016-06-12 30 views
11

Tôi đang làm việc với phương pháp filter() trong Swift, nhưng gặp phải vấn đề tôi không thể tái tạo trong sân chơi.Đóng cửa nhanh: Không thể chuyển đổi giá trị của loại '(_) -> Bool' thành loại đối số dự kiến ​​

Edit: Tải Lên một dự án ví dụ ở đây: https://www.dropbox.com/s/5ce5uyxnpb0mndf/WeirdSwifty.zip?dl=0

Tôi có một struct Card chứa một enum CardType:

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

    enum CardType { 
     case Red 
     case Black 
    } 
} 

Và một lớp Player mà duy trì một mảng của những Card mục:

class Player { 
    var hand : [Card] 

    init() { 
     hand = ... 
    } 

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

Tuy nhiên, Xcode đang ném một lỗi bất kể tôi định định dạng đóng này như thế nào. Tôi thậm chí cho phép Xcode tự động hoàn thành các chữ ký đóng/body, suy nghĩ tôi đã có một lỗi cú pháp, nhưng nó vẫn không ngừng tái tạo nó như nhau (có đúng không?) Cách:

enter image description here

Tôi cũng đã cố gắng chỉnh sửa những gì Xcode tự động tạo ra và cung cấp một phiên bản đơn giản, không có kết quả:

enter image description here

Tương tự:

enter image description here

Như tôi đề cập đến, tôi không thể tái tạo điều này trong một ví dụ sân chơi đơn giản, nhưng tôi không thể thu hẹp những gì thực sự là gây ra vấn đề trong dự án chính của tôi.

Đây là lỗi duy nhất trong dự án của tôi và nếu tôi nhận xét phương thức có chứa cuộc gọi filter(), cuộc gọi đó sẽ được tạo đúng cách.

Lỗi này có phải là một cá trích đỏ chung cho một số vấn đề thực tế khác không?

Lưu ý: Sử dụng Xcode 7.3.1 (7D1014)

+0

Hãy thử cung cấp thẻ rõ ràng: 'return hand.filter ({(thẻ: Thẻ) -> Bool trong thẻ trả về.type == .Red })' – vacawama

+2

Mã của bạn biên dịch tốt cho tôi ... có thể thử làm sạch thư mục build của bạn? – Hamish

+1

Bạn không có 'thẻ' hoặc' Thẻ' được định nghĩa ở một nơi khác trong cùng phạm vi? Các mã biên dịch tốt cho tôi quá. – Sulthan

Trả lời

17

Something flakey được happing với kiểu suy luận của Swift. Cung cấp cho card một loại rõ ràng và nó sẽ hoạt động.

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

Bạn không cần phải kiểu trả về hoặc sự trở lại:

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

Lưu ý: cũng làm việc này:

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

xác định đầy đủ giá trị enum .Red giải quyết vấn đề cũng :

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

Nó đã được đề cập trong các ý kiến ​​rằng nếu bạn di chuyển định nghĩa của Card vào cùng một tập tin như bộ lọc, mà nó hoạt động. Trên thực tế, nếu bạn tách định nghĩa của CardType enum ra khỏi Card và chỉ cần di chuyển CardType vào tệp bằng bộ lọc, nó hoạt động.

+0

Điều đó đã xảy ra, cảm ơn - sẽ phát ra sự cố. 'Return' cũng không cần thiết, nó được phỏng đoán nếu một câu lệnh đơn có giá trị trả về khớp với kiểu trả về mong đợi của việc đóng:' return hand.filter ({(thẻ: Thẻ) trong thẻ.type == .Red}) ' –

+0

@CraigOtis Nó có liên quan đến thứ tự biên dịch. Nó hoạt động nếu 'Thẻ' được khai báo trong cùng một tệp với 'Trình phát'. – Sulthan

+0

Chỉ định đầy đủ kiểu enum cũng hoạt động! 'return hand.filter ({$ 0.type == Card.CardType.Red})' – vacawama

Các vấn đề liên quan