【问题标题】:Swift - Type '*' does not conform to protocol '*'Swift - 类型“*”不符合协议“*”
【发布时间】:2015-03-10 10:34:07
【问题描述】:

我在尝试创建 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

如何解决这个协议问题?

【问题讨论】:

  • 完整的编译器输出(在“报告导航器”中)应该包含有关问题的更多信息。
  • 它只是显示这个错误信息先生。
  • @Dato'MohammadNurdin:您真的阅读了完整的编译器消息吗?我打赌有类似note: protocol requires function bla bla bla ... note: candidate has non-matching type bla bla bla ...的消息
  • 没有可接受的答案先生。

标签: ios objective-c swift


【解决方案1】:

有两个问题:

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

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

或者只是 return hash_ 并将 hash_Int 更改为 UInt 本身。

  1. BOOL 在 Objective-C 中不能为 nil,因此为了符合协议,您需要通过删除 ! 来更改 isMediaMessage() 以返回非可选的 Bool

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

【讨论】:

    【解决方案2】:

    问题可能是“散列”,即协议中的一个无符号整数,而实现中只是一个整数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-02-06
      • 2014-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多