🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

Q&A

解決済

1回答

413閲覧

変数宣言する際の「型指定」について

ruuuu

総合スコア176

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

0グッド

0クリップ

投稿2019/12/18 04:36

編集2019/12/18 04:37

Swiftにおける型について、お聞きしたく質問させていただきました。

以下は「ChatViewController.swift」になります。

import UIKit import ChameleonFramework class ChatViewController: UIViewController,UITableViewDelegate,UITableViewDataSource,UITextFieldDelegate{ @IBOutlet weak var tableView: UITableView! @IBOutlet weak var messageTextField: UITextField! //スクリーンのサイズ let screenSize = UIScreen.main.bounds.size var chatArray = [Message]() override func viewDidLoad() { super.viewDidLoad() tableView.delegate = self tableView.dataSource = self messageTextField.delegate = self tableView.register(UINib(nibName: "CustomCell", bundle:nil),forCellReuseIdentifier:"Cell") //可変 tableView.rowHeight = UITableView.automaticDimension //セルの見積もりの高さ tableView.estimatedRowHeight = 75 //キーボード NotificationCenter.default.addObserver(self, selector: #selector(ChatViewController.keyboardWillShow(_ :)), name: UIResponder.keyboardWillShowNotification, object: nil) NotificationCenter.default.addObserver(self, selector: #selector(ChatViewController.keyboardWillHide(_ :)), name: UIResponder.keyboardWillHideNotification, object: nil) //firebaseからデータをfetch(取得) } @objc func keyboardWillShow(_ notification:NSNotification){ let keyboardHeight = ((notification.userInfo![UIResponder.keyboardFrameEndUserInfoKey] as Any) as AnyObject).cgRectValue.height messageTextField.frame.origin.y = screenSize.height - keyboardHeight - messageTextField.frame.height } @objc func keyboardWillHide(_ notification:NSNotification){ messageTextField.frame.origin.y = screenSize.height - messageTextField.frame.height guard let rect = (notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue, //キーボードが下がる時間帯をデュレーションとして取る let duration = notification.userInfo?[UIResponder.keyboardAnimationDurationUserInfoKey] as? TimeInterval else{return} UIView.animate(withDuration:duration){ let transform = CGAffineTransform(translationX: 0, y: 0 ) self.view.transform = transform } } override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { messageTextField.resignFirstResponder() } func textFieldShouldReturn(_ textField: UITextField) -> Bool { textField.resignFirstResponder() return true } func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { //メッセージの数 chatArray.count } func numberOfSections(in tableView: UITableView) -> Int { return 1 } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "cell",for:indexPath) as! CustomCell cell.messageLabel.text = chatArray[indexPath.row].message cell.userNameLabel.text = chatArray[indexPath.row].sender cell.iconImageView.image = UIImage(named:"dogAvatarImage") cell.messageLabel.backgroundColor = UIColor.flatGreen() return cell } /* // MARK: - Navigation // In a storyboard-based application, you will often want to do a little preparation before navigation override func prepare(for segue: UIStoryboardSegue, sender: Any?) { // Get the new view controller using segue.destination. // Pass the selected object to the new view controller. } */ }

以下は、「Message.swift」になります。

import Foundation class Message{ var sender:String = "" var message:String = "" }

お聞きしたい点なのですが、「chatviewController」において、var chatArray = [Message]()こちらの部分で、型に「Messsage」を指定し、関数cellForRowAtにおいて、cell.messageLabel.text = chatArray[indexPath.row].messageと、Messageクラスのプロパティを指定しています。
疑問点なのですが、仮に、「文字列」がchatArrayに入ったとしても、型にMessageが指定されていた場合は強制的にキャストされるのでしょうか?
また、型を指定する際に、明示的に、自分の作ったクラスを指定した場合は、そのクラスのプロパティやメソッドを変数は、使用することができるとの解釈であっていますでしょうか?
上記2点につきまして、ご助言頂けましたら幸いです。
よろしくお願いします。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fuzzball

2019/12/18 05:11 編集

>>仮に、「文字列」がchatArrayに入ったとしても 入らないです。 >>そのクラスのプロパティやメソッドを変数は、使用することができる この「変数」とは何でしょうか?chatArrayのことですか? また、出来るかどうかは試してみれば分かることではないですか?
ruuuu

2019/12/18 05:15

説明不足で申し訳ありません。 はい。変数は「chatArray」のことです。 >>仮に、「文字列」がchatArrayに入ったとしても こちらなのですが、Message.swiftのプロパティ「message」がString型な点と「cellForRowAt」にて「 cell.messageLabel.text = chatArray[indexPath.row].message」と指定を行なっている点からchatArrayにはString型が入っているのではかなと思った次第です。
fuzzball

2019/12/18 05:25 編集

chatArray[indexPath.row] の .message がStringなのであって、chatArray[indexPath.row]がStringなのではありません。chatArray[indexPath.row]はMessage型です。
fuzzball

2019/12/18 05:25 編集

ようするに、 >>そのクラスのプロパティやメソッドを変数は、使用することができる ということです。 chatArray[indexPath.row]はMessage型なので、そのプロパティである .message を使用できます。
ruuuu

2019/12/18 07:29 編集

ありがとうございます。 勘違いしている部分が理解できました。
guest

回答1

0

ベストアンサー

chatArrayは、文字列型ではありません。
let chatArray = [Message]()

let chatArray: [Message] = []
と同じです。
後者のほうが型がわかりやすいと思いますが、chatArray[Message]型で、Messageの配列です。

chatArray[indexPath.row].messageでは、chatArray[indexPath.row]で配列のindexPath.row番目のMessage型のインスタンスを取り出して、それの中のmessageプロパティの値を読み出しています。

Swiftは勝手なキャストはしません。プログラマが明示的に指定しないと、型が違うとしてエラーになります。

したがって、chatArrayに文字列型が入る事はありません。エラーになります。chatArray[i].messagechatArray[i].senderには文字列を入れられます。(iがchatArray.countより小さい場合に限る)

自分で作ったクラスや構造体を指定した場合は、そのプロパティを読み書きしたり、メソッドを呼び出したりできます。Messageクラスと、自分が作ったクラスの間に特別な違いはありません。同じような事ができます。

投稿2019/12/18 05:52

eytyet

総合スコア803

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ruuuu

2019/12/18 07:29

ご回答ありがとうございます。 毎回感謝です。 自分が勘違いをしていた点を理解することができました。 「 let chatArray: [Message] = [] 」このように指定した場合、chatArrayのその要素一つ一つに対して、Messageオブジェクトが入ることを想定とした、型指定であったといった訳だったのですね... 勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問