Я создал протокол BaseMessageItemProtocol
, который подтверждает class
, и другой протокол Differentiable
, который имеет связанный тип associatedtype DifferenceIdentifier: Hashable
. Теперь модель ImageMessageModel
подтверждает BaseMessageItemProtocol
.
У меня есть UIViewController
, который имеет массив BaseMessageItemProtocol
как var chatItems = [BaseMessageItemProtocol]()
. Но это дает мне ошибку Protocol 'BaseMessageItemProtocol' can only be used as a generic constraint because it has Self or associated type requirements
. Я никогда не использовал дженерики в своем 1-летнем опыте разработки iOS.
Мой код Differentiable
Протокол: (Это из этой библиотеки https://github.com/ra1028/DifferenceKit)
public typealias Differentiable = ContentIdentifiable & ContentEquatable
public protocol ContentIdentifiable {
/// A type representing the identifier.
associatedtype DifferenceIdentifier: Hashable
/// An identifier value for difference calculation.
var differenceIdentifier: DifferenceIdentifier { get }
}
public protocol ContentEquatable {
func isContentEqual(to source: Self) -> Bool
}
BaseMessageItemProtocol
протокол:
protocol BaseMessageItemProtocol: class, Differentiable {
var showSenderName: Bool { get set }
var showDataSeperator: Bool { get set }
var messageId: String { get }
var isIncoming: Bool { get }
var senderId: String { get }
var senderName: String { get }
var senderImageUrl: String { get }
var messageDate: Date { get }
var isMessageSelectorOn: Bool { get set }
var isMessageSelected: Bool { get set }
var uploadProgress: Double { get set }
var showMessageStatusView: Bool { get set }
}
ImageMessageModel
код:
class ImageMessageModel: BaseMessageItemProtocol {
var differenceIdentifier: String {
return messageId
}
func isContentEqual(to source: ImageMessageModel) -> Bool {
return self.showMessageStatusView == source.showMessageStatusView && self.showSenderName == source.showSenderName && self.showDataSeperator == source.showDataSeperator
}
var showSenderName: Bool = false
var showDataSeperator: Bool = false
var uploadProgress: Double = 0.0
var isMessageSelectorOn: Bool = false
var isMessageSelected: Bool = false
var messageId: String {
return self.baseMessageModel.messageId
}
var isIncoming: Bool {
return self.baseMessageModel.isIncoming
}
var senderId: String {
return self.baseMessageModel.senderId
}
var senderName: String {
return self.baseMessageModel.senderName
}
var senderImageUrl: String {
return self.baseMessageModel.senderImageUrl
}
var messageDate: Date {
return self.baseMessageModel.messageDate
}
var messageType: BaseMessageType {
return .image
}
var showMessageStatusView: Bool = false
var messageStatus: BaseMessageStatus
var messageSource: MessageSource?
var baseMessageModel: BaseMessageModel
var localImage: UIImage?
var imageUrl: String?
init(baseMessageModel: BaseMessageModel, fileImageUrl: String?, source: MessageSource? = .remote, localImage: UIImage? = nil) {
self.baseMessageModel = baseMessageModel
self.imageUrl = fileImageUrl
self.messageSource = source
self.localImage = localImage
self.messageStatus = baseMessageModel.messageStatus
}
}