[英]Swift - Type '*' does not conform to protocol '*'
尝试创建Message
类时收到此错误消息。
'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 中不能为 nil,所以你不能返回一个可选项。 您需要在Message
类中更改其实现以返回UInt
func hash() -> UInt { return UInt(hash_); }
或者简单地return hash_
并将hash_
从Int
更改为UInt
本身。
BOOL
不能在Objective-C为零,所以符合你需要改变协议isMediaMessage()
返回一个非可选Bool
通过删除!
:
func isMediaMessage() -> Bool { return isMediaMessage_; }
问题可能是“散列”,即协议中的 unsigned int 和实现中的 int。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.