[快速]剖析MessageKit


你好。
它仍然是一条小鱼,但我只是在考虑编程。
在这种情况下,我对MessageKit的理解加深了我对编程的理解。
我写了这篇文章。

关于用于创建投资组合(例如聊天应用程序)的MessageKit
文章解释。
我认为,如果您特别注意模具,视野会扩大。

MessageKit代码概述

聊天所需的信息是
发件人信息
?消息类型,信息
只要有了这两个,就可以在这两个地方就可以实现MessageKit。

什么是发件人信息?

?userId(唯一ID)
您可以注册为用户,
如果您不想注册,请使用终端的唯一ID(UDID)临时实现。 (实用)
?userName(显示在显示屏上)

什么是消息类型和信息?

?messageId(用于删除具有唯一ID的消息)
?messageType(文本,图片,视频等)
日期(聊天,排序也需要)
?messageContent(消息内容)

MessageKit可以实现有关这么多信息的信息。

发件人类型

这是发件人信息的协议。
协议遵循时描述此处描述的属性和功能。
如果您不编写它,将会很生气,这将有助于提高代码的可维护性。

1
2
3
4
5
6
7
8
9
10
public protocol SenderType {

    /// The unique String identifier for the sender.
    ///
    /// Note: This value must be unique across all senders.
    var senderId: String { get }

    /// The display name of a sender.
    var displayName: String { get }
}

SenderType协议的内容如下所示。
将SenderType写为导入MessageKit,
命令放置光标

跳转到定义
您可以通过跳至描述位置进行检查。

SenderType协议的内容为
描述了senderId和displayName。
我们将在此处实现符合此协议的Sender结构。

1
2
3
4
struct Sender: SenderType {
    var senderId: String
    var displayName: String
}

现在,您已具有发送者信息的结构。
在聊天实施中,与发件人相关的过程为
我们将使用这种结构作为模具。
哦,如果要实现聊天,请编写此代码。

讯息类型

开头提到的另一个最低要求信息,即消息类型信息。
看看里面。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public protocol MessageType {

    /// The sender of the message.
    var sender: SenderType { get }

    /// The unique identifier for the message.
    var messageId: String { get }

    /// The date the message was sent.
    var sentDate: Date { get }

    /// The kind of message and its underlying kind.
    var kind: MessageKind { get }

}

发件人类型是SenderType类型。
较早实现的发件人是一种符合MessageType的结构。
通过将其分配给sender属性来使用它。

messageId已经说明,但是消息的ID。
用于删除单个消息。

sentDate是日期信息。

种类确定消息是文本,照片还是视频。
看看里面。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public enum MessageKind {

    /// A standard text message.
    ///
    /// - Note: The font used for this message will be the value of the
    /// `messageLabelFont` property in the `MessagesCollectionViewFlowLayout` object.
    ///
    /// Using `MessageKind.attributedText(NSAttributedString)` doesn't require you
    /// to set this property and results in higher performance.
    case text(String)

    /// A message with attributed text.
    case attributedText(NSAttributedString)

    /// A photo message.
    case photo(MediaItem)

    /// A video message.
    case video(MediaItem)

    /// A location message.
    case location(LocationItem)

    /// An emoji message.
    case emoji(String)
    //以下省略

您可以看到它被

枚举划分为大小写。
文字,attributeText,图片等。

这是符合MessageType的结构。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
struct Message: MessageType {
    var sender: SenderType
    var messageId: String
    var sentDate: Date
    var kind: MessageKind

    private init(kind: MessageKind, sender: Sender, messageId: String, date: Date) {
        self.kind = kind
        self.sender = sender
        self.messageId = messageId
        self.sentDate = date
    }
    init(attributedText: NSAttributedString, sender: Sender, messageId: String, date: Date) {
        self.init(kind: .attributedText(attributedText), sender: sender, messageId: messageId, date: date)
    }
}

至少可以这样实现。
有私有的init和没有私有的init。
这会将MessageKind从外部访问的初始化过程分开,
通过私有init初始化Message结构。

如果您还希望发送照片和视频,请此init不公开
我将添加该数字,但是由于假定它只是文本,所以我只准备了一个。

下次:ChatViewController

的实现

除非有特殊答复,否则我不会写下一篇文章。
不,对MessageKit的需求是什么?
装饰系统的描述?