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

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

ただいまの
回答率

87.35%

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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 633

score 111

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点につきまして、ご助言頂けましたら幸いです。
よろしくお願いします。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

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

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

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

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

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

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

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

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • fuzzball

    2019/12/18 14:22 編集

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

    キャンセル

  • fuzzball

    2019/12/18 14:24 編集

    ようするに、
    >>そのクラスのプロパティやメソッドを変数は、使用することができる
    ということです。

    chatArray[indexPath.row]はMessage型なので、そのプロパティである .message を使用できます。

    キャンセル

  • ruuuu

    2019/12/18 16:29 編集

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

    キャンセル

回答 1

checkベストアンサー

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 16:29

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

    キャンセル

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

  • ただいまの回答率 87.35%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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