Создать массив протоколов, который подтверждает другой протокол Generi c в ViewController - PullRequest
0 голосов
/ 09 апреля 2020

Я создал протокол 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
    }
}
...