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

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

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

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

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

Xcode

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

Swift

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

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Q&A

解決済

1回答

837閲覧

Swift辞書初期化のランタイムエラー

tanakashunta

総合スコア23

iOS

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

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

Xcode

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

Swift

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

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

0グッド

0クリップ

投稿2021/07/15 15:42

辞書のデータ更新の問題についてです。
問題URL(https://paiza.jp/works/mondai/c_rank_level_up_problems/c_rank_dictionary_step2)

問題文
n 人の人の名前 s_1, ..., s_n が与えられたのち、 m 回の「攻撃」に関する情報が与えられます。各行は “p_i a_i” というフォーマットで与えられ、 p_i はダメージを受けた人の名前 (s_1, ..., s_n のいずれか) 、 a_i は p_i が受けたダメージ数を表す数です。

最後に人名 S が与えられるので (S は s_1, ..., s_n のいずれか) 、 S が受けたダメージの合計を出力してください。なお、一度もダメージを受けていない人の合計ダメージは 0 とします。

条件
・1 ≤ n, a_i ≤ 50 (1 ≤ i ≤ n)
・各 s_i (1 ≤ i ≤ n) は大小アルファベットからなる長さ 1 以上 10 以下の文字列で、互いに全て異なる

入力例
2
Kirishima
Kyoko
2
Kyoko 1
Kyoko 2
Kyoko

出力例
3

このコードで正解はできたのですが納得できないところがあります。

var dic : [String:Int] = [:] let n = Int(readLine()!)! for _ in 0..<n { dic[readLine()!] = 0 } let m = Int(readLine()!)! for _ in 0..<m { let arr = readLine()!.split(separator: " ").map{ String($0) } dic[arr[0]]! += Int(arr[1])! } let S = readLine()! print(dic[S]!)

一つ目

dic[readLine()!] = 0

dic = [readLine()!,0]

だと入力によってはランタイムエラーになります。


2つ目

let arr = readLine()!.split(separator: " ").map{ String($0) }

はmapを使わないとエラーになりますが最初からString型ではないのでしょうか
またString型に直さないといけないのであれば

let arr : [String:String] = readLine()!.split(separator: " ")

でもいいのかと思いましたがダメでした。

以上の2点についてご教示いただけると幸いです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

一つ目

swift

1dic = [readLine()!,0]

これはコンパイルエラーになりますが、,: の間違いでしょうか?

swift

1dic = [readLine()!: 0]

この場合、既存の辞書に要素を追加するのではなく、[readLine()!: 0] という一要素の辞書で dic 全体が上書きされます。つまり、

2 Kirishima Kyoko (以下略)

という入力があると、本来は ["Kirishima": 0, "Kyoko": 0] という辞書になってほしいと思いますが、まず Kirishima で dic の中身は ["Kirishima": 0] になり、次の Kyoko では ["Kyoko": 0] だけになってしまいます。


2つ目

String の split メソッド の戻り値の型は [Substring] で、Substring は String とは異なる型なので、[String] に変換したいなら map する必要があります。
参考: 【Swift】String.SubSequenceとは何か? - Qiita

ちなみに、次のようにすれば arr の型は [Substring] のまま取り扱うことができます。

swift

1let arr = readLine()!.split(separator: " ") 2dic[String(arr[0])]! += Int(arr[1])!

投稿2021/07/15 17:01

hoshi-takanori

総合スコア7901

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

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

tanakashunta

2021/07/15 17:35

一つ一つのメソッドについての正確な理解が大事だということ身にしみて分かりました... とても分かりやすい回答をありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問