Swift – types'*'不符合协议'*'

尝试创buildMessage类时收到此错误消息。

 'Message' does not conform to protocol 'JSQMessageData' 

JSQMessageData从https://github.com/jessesquires/JSQMessagesViewController获得

在这里输入图像说明

我的代码

 import Foundation class Message : NSObject, JSQMessageData { var senderId_ : String! var senderDisplayName_ : String! var date_ : NSDate var isMediaMessage_ : Bool var hash_ : Int = 0 var text_ : String init(senderId: String, senderDisplayName: String?, isMediaMessage: Bool, hash: Int, text: String) { self.senderId_ = senderId self.senderDisplayName_ = senderDisplayName self.date_ = NSDate() self.isMediaMessage_ = isMediaMessage self.hash_ = hash self.text_ = text } func senderId() -> String! { return senderId_; } func senderDisplayName() -> String! { return senderDisplayName_; } func date() -> NSDate! { return date_; } func isMediaMessage() -> Bool! { return isMediaMessage_; } func hash() -> Int? { return hash_; } func text() -> String! { return text_; } } 

JSQMessageData.h

 #import <Foundation/Foundation.h> #import "JSQMessageMediaData.h" @protocol JSQMessageData <NSObject> @required - (NSString *)senderId; - (NSString *)senderDisplayName; - (NSDate *)date; - (BOOL)isMediaMessage; - (NSUInteger)hash; @optional - (NSString *)text; - (id<JSQMessageMediaData>)media; @end 

请咨询如何解决这个协议问题。 谢谢。

有两个问题:

  1. hash被定义为在协议中返回一个NSUInteger的方法。 而且, NSUInteger在Objective-C中不能为零,所以你不能返回一个可选项。 您需要在Message类中更改其实现以返回UInt

     func hash() -> UInt { return UInt(hash_); } 

或者直接return hash_并将hash_Int更改为UInt本身。

  1. BOOL不能在Objective-C中为零,所以为了符合协议,你需要改变isMediaMessage()来返回一个非可选的Bool通过删除!

     func isMediaMessage() -> Bool { return isMediaMessage_; } 

问题可能是“哈希”,这是协议中的无符号整数,只是在实现中的一个int。