質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

受付中

String以外のイニシャライザの設定の仕方が分かりません。

削除済ユーザー
削除済ユーザー

総合スコア0

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0回答

0評価

0クリップ

9閲覧

投稿2021/02/02 09:12

編集2022/01/12 10:55

前提・実現したいこと

MessageKitによるメッセージ機能の実装を実現したいと考えています。最終的にmessagesの中にデータを入れることができれば画面に表示されるだろうと考えており、MessageKitMessageにデータを入れる必要があると考えました。その際initを設定してデータを入れた方がいいのでは無いかと考えました。が、String以外の変数の初期設定?の仕方が分からずつまずきました。

発生している問題・エラーメッセージ

ビルドは成功するのですが以下のようなエラ〜メッセージが表示され、クラッシュします。

Could not cast value of type '__NSCFString' (0x7fff873ff068) to 'MessageKit.MessageKind' (0x10947f828).

as以降に問題があるのでは無いかと考えたのですが、どのように修正をしなければならないのか検討がつきません。

self.kind = dic["kind"] as! MessageKind self.sentDate = dic["senderId"] as! Date

該当のソースコード

import UIKit import MessageKit import MessageInputBar import InputBarAccessoryView import FirebaseFirestore import FirebaseAuth import FirebaseStorage import Nuke struct Sender: SenderType{ var senderId: String var displayName: String init(dic: [String: Any]){ self.senderId = dic["senderId"] as? String ?? "" self.displayName = dic["displayName"] as? String ?? "" } } struct MessageKitMessage: MessageType{ var sender: SenderType var messageId: String let sentDate: Date var kind: MessageKind init(dic: [String: Any]){ self.sender = Sender(dic: dic) self.messageId = dic["messageId"] as? String ?? "" self.kind = dic["kind"] as! MessageKind self.sentDate = dic["senderId"] as! Date // self.kind = dic["displayName"] as! MessageKind } } class MessageKitChatViewController: MessagesViewController, InputBarAccessoryViewDelegate, MessageInputBarDelegate{ var senderUser = Auth.auth().currentUser! var messages = [MessageType]() // let currentUser = Sender(senderId: Auth.auth().currentUser!.uid, displayName: Auth.auth().currentUser!.displayName ?? "Name not found") var passedId: String! var passedDisplayName: String! var currentUser: Sender! = nil var otherUser: Sender! = nil var passedChatroomId: String! override func viewDidLoad() { super.viewDidLoad() messagesCollectionView.messagesDataSource = self messagesCollectionView.messagesLayoutDelegate = self messagesCollectionView.messagesDisplayDelegate = self messageInputBar.delegate = self guard let currentUserId = Auth.auth().currentUser?.uid else { return } print("currentUserId") print(currentUserId) print("currentUserId") Firestore.firestore().collection("users").document(currentUserId).getDocument { (snapshot, error) in if error != nil{ print(error) }else{ guard let dic = snapshot?.data() else { return } let user = User(dic: dic) let currentUserName = user.userName // self.currentUser = Sender(senderId: currentUserId, displayName: currentUserName) let dic2 = ["senderId": dic["userId"], "displayName": dic["userName"]] self.currentUser = Sender(dic: dic2 as [String : Any]) } } Firestore.firestore().collection("users").document(passedId).getDocument { (snapshot, error) in if error != nil{ print(error) }else{ guard let dic = snapshot?.data() else { return } let user = User(dic: dic) let otherUserName = user.userName let dic2 = ["senderId": dic["userId"], "displayName": dic["userName"]] self.otherUser = Sender(dic: dic2) } } // otherUser = Sender(senderId: passedId, displayName: passedDisplayName) loadMessages() } func inputBar(_ inputBar: InputBarAccessoryView, didPressSendButtonWith text: String) { Firestore.firestore().collection("chatRooms").document(passedChatroomId).collection("messages").addDocument(data: ["senderId": currentUser.senderId, "displayName": currentUser.displayName, "messageId": "", "sentDate": Timestamp().dateValue(), "kind": text]) { (error) in if error != nil{ print(error) }else{ print("メッセージの保存、送信が完了") inputBar.inputTextView.text = nil } } } func loadMessages(){ Firestore.firestore().collection("chatRooms").document(passedChatroomId).collection("messages").getDocuments { (snapshots, error) in if error != nil{ print(error) }else{ snapshots?.documents.forEach({ (snapshot) in let dic = snapshot.data() let kind = dic["kind"] let senderId = dic["senderId"] let sentDate = dic["sentDate"] let displayName = dic["displayName"] let messageId = dic["messageId"] let sender = Sender(dic: dic) print("'''''''''''''''") print(sender) print("'''''''''''''''") print(kind) print(senderId) print(sentDate) print(displayName) print(messageId) self.messages.append(MessageKitMessage(dic: dic)) print("messages") print(self.messages) print("messages") // MessageKitMessage(sender: sender, messageId: messageId, sentDate: sentDate, kind: kind) // // let sender = Sender(senderId: senderId!, displayName: displayName!) // if senderId != nil { // if displayName != nil{ // let sender = Sender(senderId: senderId!, displayName: displayName!) // } // // } // Sender(senderId: senderId, displayName: displayName) // self.messages.append(MessageKitMessage(dic: dic)) }) } } } } extension MessageKitChatViewController: MessagesDataSource{ func currentSender() -> SenderType { return currentUser } func messageForItem(at indexPath: IndexPath, in messagesCollectionView: MessagesCollectionView) -> MessageType { return messages[indexPath.section] } func numberOfSections(in messagesCollectionView: MessagesCollectionView) -> Int { return messages.count } } extension MessageKitChatViewController: MessagesLayoutDelegate{ } extension MessageKitChatViewController: MessagesDisplayDelegate{ }

試したこと

as以降の部分にいろんなものを入れたり試したりしました。
他にはinit丸々無くしてやろうとしたのですがオプショナル?の問題で上手くいきませんでした。

用語の定義が自分の中でイマイチ理解できていない部分があり説明が上手くできません。ごめんなさい。

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています