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
请咨询如何解决这个协议问题。 谢谢。
有两个问题:
-
hash
被定义为在协议中返回一个NSUInteger
的方法。 而且,NSUInteger
在Objective-C中不能为零,所以你不能返回一个可选项。 您需要在Message
类中更改其实现以返回UInt
func hash() -> UInt { return UInt(hash_); }
或者直接return hash_
并将hash_
从Int
更改为UInt
本身。
-
BOOL
不能在Objective-C中为零,所以为了符合协议,你需要改变isMediaMessage()
来返回一个非可选的Bool
通过删除!
:func isMediaMessage() -> Bool { return isMediaMessage_; }
问题可能是“哈希”,这是协议中的无符号整数,只是在实现中的一个int。