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

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

新規登録して質問してみよう
ただいま回答率
85.47%
キャスト

キャストとは、オブジェクトの型の変換が許可された場合に、明白に別の型への変換を行うプロセスのことです。

Swift

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

Q&A

解決済

2回答

302閲覧

Swift4 "as?" の役割について

rsc28155

総合スコア19

キャスト

キャストとは、オブジェクトの型の変換が許可された場合に、明白に別の型への変換を行うプロセスのことです。

Swift

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

0グッド

0クリップ

投稿2018/09/03 07:42

編集2018/09/04 02:12

コード

swift4

101 extension ConversationViewController: MessageInputBarDelegate { 202 303 /* 404 * 送信ボタンをタップした際のデリゲートメソッド 505 */ 606 func messageInputBar 707 (_ inputBar: MessageInputBar, didPressSendButtonWith text: String) 8 08{ 909 for component in inputBar.inputTextView.components { 1010 1111 if let text = component as? String { 1212 1313 //メーセージリストに追加 1414 let sender = currentSender() 1515 self.chatRoomModel?.sendMessage 1616 (text: text, userId: sender.id, userName: sender.displayName) 1717 { error in 1818 if error == nil { 1919 print("メッセージ送信成功") 2020 } else { 2121 print("メッセージ送信失敗") 2222 } 2323 } 2424 2525 } 2626 2727 } 2828 2929 //入力のTextFieldをリセット 3030 inputBar.inputTextView.text = String() 3131 } 3232 3333}

前提・実現したいこと

上記ソースコード内の"as?"は、どういう役割のために記述されているのでしょうか?
キャスト(型変換)を、理解出来ていないので、わかりやすく教えて頂けると嬉しいです。

試したこと

インターネットで"キャスト"や"型変換"について調べました。
参考にしたサイト
[swift]基本構文覚え書き キャストとか
Swift as!について - Qiita
型キャスト | Swift言語を学ぶ - Tea Leaves

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

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

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

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

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

fuzzball

2018/09/03 07:58

コードが ``` で囲えていません。(閉じる方の ``` が無い)
fuzzball

2018/09/03 07:59

あと、参考にしたサイトを書くときはURLも書いて下さい。(リンクのMarkdownを使って下さい)
guest

回答2

0

ベストアンサー

キャストはInt型の変数の値をStringにして使いたい時などに用いられる手法です。

型変換とも呼ばれます。
下記のコードだと型が違うのでエラーが発生してしまいます。

Swift

1var hoge:Int = 10 2var moji:String = hoge 3

このようにString(変数)とすることでString型として値を扱うことができます。
String()はStringのイニシャライザです。

Swift

1var hoge:Int = 10 2var moji:String = String(hoge) 3

asはダウンキャストをする際に使われるもので、humanというスーパークラスがいてhumanを継承したサブクラスにTanakaがいたとします。クラス書くのめんどくさいんで省略

下記の例では田中クラスのスーパークラスのHumanをそのまま代入しようとしています。TanakaはHumanですが、Humanにはないメソッドやメンバを持っているかもしれないのでこのまま代入しようとするとエラーになります。

Swift

1var human:Human = Human() 2var tanaka:Tanaka = Human()

代入するにはas演算子を用いてダウンキャストしてあげないといけません

Swift

1var human:Human = Human() 2var tanaka:Tanaka = Human() as? Tanaka() 3```  4 5私の認識だとas演算子はこんな感じの使い方をします。

投稿2018/09/05 03:42

harumi

総合スコア407

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

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

rsc28155

2018/09/05 11:38

回答頂きまして、ありがとうございます! 型変換の説明参考になりました。 記載したコード内の"as!"は、どういった動きをしているのかが知りたいのですが、記載したコード部分では情報不足でしょうか?
harumi

2018/09/10 23:58

if let text = component as? String { 上記の部分ですよね?as!は見当たりませんでした... これはcomponentをString型に変換しています。asに?がついていますので変換ができた場合はif文の中が実行されます。 もしもこの部分がas!だった場合変換は絶対にできるとプログラマが約束しているということでSwiftは無理やりキャストを行います。String型に変換できる場合は問題なくif文の中が実行されますが、キャストができなかった場合アプリがクラッシュします。 !と?についてはオプショナル物を調べるとたくさん出てくると思うので参照してみてください
rsc28155

2018/09/21 00:56

参考書をもう一度読み直してみました。 harumi さんの説明がわかるようになりました。 わかりやすい説明を頂きましてありがとうございます。
harumi

2018/09/21 01:00

よかったです! 僕もまだまだ未熟なので一緒に頑張りましょう!
guest

0

as?はダウンキャストを行い、失敗するとnilを返します。
ちなみに、as!はダウンキャストを行い、失敗すると落ちます。

ref.
Downcasting

Markdown

[テキスト]と(URL)の間に改行が入ってるのでは?

text

1[[swift]基本構文覚え書き キャストとか](https://qiita.com/nitaking/items/3f0a7b8e7f7223a1c62a)

[swift]基本構文覚え書き キャストとか

投稿2018/09/03 07:57

編集2018/09/04 00:18
fuzzball

総合スコア16731

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

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

fuzzball

2018/09/04 00:18

Markdownについて追記しました。
rsc28155

2018/09/05 11:39

teratailの使用方法参考になりました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問