简体   繁体   中英

Cannot conform to objective-c protocol in swift

I'm trying to implement the awesome library JSQMessagesViewController but I keep getting the error "'ModelMessage' does not conform to protocol 'JSQMessageData'" even though my class inherit from NSObject and I implement the required properties

Here is the protocol:

@protocol JSQMessageData <NSObject>

@required
 - (NSString *)senderId;
 - (NSString *)senderDisplayName;
 - (NSDate *)date;
 - (BOOL)isMediaMessage;
 - (NSUInteger)messageHash;

 @optional
 - (NSString *)text;
 - (id<JSQMessageMediaData>)media;

@end

and here is my class

import Foundation

class ModelMessage: Model, JSQMessageData {

/* Required */
var senderId: NSString
var senderDisplayName: NSString
var date: NSDate
var isMediaMessage: Bool
var messageHash: UInt
/**/

var text_: String

var id:String!
var conversationId: String!
var imageUrl: String?
var recipientId: String!
var recipientRead: Bool!

var avatar: NSData?


init(data: NSDictionary){

    super.init()

    /* Required */
    self.senderId = getStringFromJSON(data, key:"senderId")
    self.senderDisplayName = "Me"
    let dateString = getStringFromJSON(data, key: "timeStamp")
    let dateDouble = (dateString as NSString).doubleValue / 1000.0
    self.date = NSDate(timeIntervalSince1970: dateDouble)
    self.isMediaMessage = false
    /**/

    self.text_ = getStringFromJSON(data, key:"text")

    self.id = getStringFromJSON(data, key:"id")
    self.conversationId = getStringFromJSON(data, key:"conversationId")
    self.recipientId = getStringFromJSON(data, key:"recipientId")
    self.recipientRead = data["recipientRead"] as! Bool

}

}

which inherit from

import Foundation

class Model: NSObject
{

func getStringFromJSON(data: NSDictionary, key: String) -> String {

    if let info = data[key] as? String{
        return info
    }
    return ""

}

}

Try using implicitly unwrapped optionals when implementing ObjC protocols without nullability annotations. Also you can and should always use String instead of NSString .

var senderId: String!
var senderDisplayName: String!
var date: NSDate!
var isMediaMessage: Bool
var messageHash: UInt

Annotating the whole class and/or the properties with @objc could also help.

If that still doesn't work then check the build log as it will tell you what protocol function is missing or not implemented correctly.

try this

import Foundation

class ModelMessage: NSObject , JSQMessageData {

/* Required */
var senderId: NSString
var senderDisplayName: NSString
var date: NSDate
var isMediaMessage: Bool
var messageHash: UInt
/**/

var text_: String

var id:String!
var conversationId: String!
var imageUrl: String?
var recipientId: String!
var recipientRead: Bool!

var avatar: NSData?


init(data: NSDictionary){

    super.init()

    /* Required */
    self.senderId = getStringFromJSON(data, key:"senderId")
    self.senderDisplayName = "Me"
    let dateString = getStringFromJSON(data, key: "timeStamp")
    let dateDouble = (dateString as NSString).doubleValue / 1000.0
    self.date = NSDate(timeIntervalSince1970: dateDouble)
    self.isMediaMessage = false
    /**/

    self.text_ = getStringFromJSON(data, key:"text")

    self.id = getStringFromJSON(data, key:"id")
    self.conversationId = getStringFromJSON(data, key:"conversationId")
    self.recipientId = getStringFromJSON(data, key:"recipientId")
    self.recipientRead = data["recipientRead"] as! Bool

}

func getStringFromJSON(data: NSDictionary, key: String) -> String {

    if let info = data[key] as? String{
        return info
    }
    return ""

}


}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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