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

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

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

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

Q&A

解決済

2回答

553閲覧

NSDictionaryから値を型変換(Int型)して変数に代入する方法

Yuya4i

総合スコア7

Swift

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

0グッド

0クリップ

投稿2018/04/04 13:09

編集2018/04/05 05:03

前提・実現したいこと

NSDictionaryとして取得したデータの中にある数値をInt型として別変数に代入したいです。

試したこと

たとえば、valueのfirstという項目に数値"10"が格納されていたとします。
それをelementにInt型として代入する場合以下のように記載すると思います。しかし、「→」の部分のエラーが生じます。

let value = dataList.value as? NSDictionary let element = value?["first"] as? Int → error: Cannot assign value of type 'Int?' to type 'String?' let element = Int(value?["first"]) → error: Cannot invoke initializer for type 'Int' with an argument list of type '(Any?)'

以下のようにすることでoptional型にはできましたが、アンラップ時にエラーがで解決に至りませんでした。

let element = value?["first"] as? String print(element) // optional(10) let num = Int(element!) → error: Cannot assign value of type 'Int?' to type 'String?'

[追記]

実際に用いたデータは以下のような構成になっています。

root |--user : |-- name: 山田太郎 : |-- nameKana: ヤマダタロウ |-- admissionYear: 26 |-- grade: 3 |-- sex: 男 |-- undergraduate: 理学部
import UIKit import Firebase class infoController: UIViewController { @IBOutlet weak var gradeLabel: UILabel! let DB = Database.database().reference() override func viewDidLoad() { super.viewDidLoad() DB.child("user").observe(.value, with: {(snapshot) in let value = snapshot.value as? NSDictionary self.gradeLabel.text = Int(value?["grade"]) // ここでエラーが生じます。gradeLabelで「3」と表示させたいです。 }) } }

補足情報(FW/ツールのバージョンなど)

言語: Swift
実行環境: Xcode

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

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

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

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

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

MasakiHori

2018/04/04 14:56

おそらくここに書き写したものが間違えています。もう一度確認してください。 ご提示のコードでは value?["first"] はエラーになります。
Yuya4i

2018/04/04 16:22

ご指摘の通り、valueの定義部分で「as!」となっていたので「as?」に訂正いたしました。
newmt

2018/04/04 22:10 編集

dataListやdataList.valueにはどういった値が入っていますでしょうか?ご質問の内容のように["first": 10]のようなNSDictionaryの値だとしたらlet element = value?["first"] as? Stringはnilになるはずで、["first": "10"]だとしたらうまくいくような気がします。(私の環境だと上手くいきました)
Yuya4i

2018/04/05 05:02

実際に使用したのがfirebaseなので、どのように格納されているのか当方では確認できませんでした。そのため、再度コードを追記致しました。よろしくお願いします。
guest

回答2

0

ベストアンサー

こちらですといかがでしょうか?

let intValue = value?["grade"] as? Int ?? 0 self.gradeLabel.text = String(intValue)

投稿2018/04/05 07:43

newmt

総合スコア1277

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

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

Yuya4i

2018/04/05 08:01

ありがとうございます。表示されました!  今回のこの方法ですと、文字列として表示していると思うのですが、もし数値として表示する場合はどのようにコードを書いたら良いのでしょうか。
newmt

2018/04/05 08:09

数値として表示するとはどういうイメージでしょうか?self.gradeLabel.textがStringですのでStringでしか設定できないと思います。
Yuya4i

2018/04/05 11:38

変数定義のようにself.gradeLabel.textにInt型で代入できるものと思っていました。String型のみの扱いなのですね。知識不足でした。ありがとうございます。
ponta7257

2019/03/18 08:11

"(Int型の変数)" でintの変数をsetTextできますよ!!
guest

0

.textに代入するならStringじゃないのかな?

swift

1self.gradeLabel.text = value?["grade"] as? String ?? ""

投稿2018/04/05 05:15

fuzzball

総合スコア16731

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

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

Yuya4i

2018/04/05 07:39

回答ありがとうございます。 記載していただいたコードで試しましたが、何も表示されませんでした。
fuzzball

2018/04/05 08:10 編集

(解決したようなので削除)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問