繁体   English   中英

Swift - 类型“*”不符合协议“*”

[英]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

如何解决此协议问题?

有两个问题:

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

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

或者简单地return hash_并将hash_Int更改为UInt本身。

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

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

问题可能是“散列”,即协议中的 unsigned int 和实现中的 int。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM