48127


チャットUIを作るためにMessageKitを利用して開発しようとしているのですが、  
下にあるように公式のサンプルと同じくmessagesDataSourceにselfを入れようとしても、  
Cannot assign value of type "ViewController" to type "MessagesDataSource"  
と表示されて設定できません。  
問題点が分かる方がいれば、教えていただきたいです。  
よろしくお願い致します。

import UIKit  
import MessageKit

class ViewController: MessagesViewController {

[code]

    var messages: [Message] = []
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    
        messagesCollectionView.messagesDataSource = self
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
[/code]

}


CC BY-SA 4.0
2018-09-05T15:40:50.940
48125
2018-09-05T16:20:40.300
27271
question
swift ios swift4
Swift のライブラリMessageKitについて


私はMessageKitは使ったことがないんですが、"MessageKit
使い方"で見つかった記事と、[ソースコード](https://github.com/MessageKit/MessageKit)によると、その行は`ViewController`を`MessagesDataSource`に適合させない限りコンパイルできません。

「公式のサンプル」がなんのことを指しているのか、はっきりとはわからないのですが、上記GitHubのExampleのコードを見ても、他のネット上の記事でも次のような`extension`が定義されているはずです。

[code]

    extension ViewController: MessagesDataSource {
       func currentSender() -> Sender {
          return ... //アプリのユーザの情報を`Sender`型で返す
       }
    
       func numberOfSections(in messagesCollectionView: MessagesCollectionView) -> Int {
          return messages.count
        }
    
       func messageForItem(at indexPath: IndexPath, in messagesCollectionView: MessagesCollectionView) -> MessageType {
          return messages[indexPath.section]
        }
    }
    
[/code]

`ViewController`と同じソースファイルの最後に、上記のような`extension`を追加してみてください。`MessagesDataSource`プロトコルには他のメソッドもいくつか定義されていますが、どれもデフォルト実装が与えられているので、最低限上記3つのメソッドを実装すれば`MessagesDataSource`に適合させられます。(`func
currentSender() ->
Sender`の実装方法はあなたのアプリがユーザ情報をどのように保持するかによって変わります。動作確認用のお試し実装なら、上記のキーワードで見つかる記事中などから見つかると思います。)

もちろん、他のメソッドも実装することにより、いろんな部分をカスタマイズできるようになっています。

他にも

[code]

        messagesCollectionView.messagesLayoutDelegate = self
        messagesCollectionView.messagesDisplayDelegate = self
        messagesCollectionView.messageCellDelegate = self
        messageInputBar.delegate = self
    
[/code]

辺りのコードを書かれることになるんだろうと思いますが、そのそれぞれで別々のプロトコルに適合させておかないとエラーになります。

Swiftの場合、必須のプロトコル適合が`class`定義から離れた場所に書けてしまうのでわかりにくいんですが、プロトコルに適合させるための`extension`抜きでは、体験されたように`class`定義本体がコンパイル出来なくなったりします、お気をつけ下さい。とりあえずご質問のエラーは上記の`extension`を追加すれば出なくなるはずです。


CC BY-SA 4.0
2018-09-05T16:20:40.300
48127
2018-09-05T16:20:40.300
13972
48125
answer