Menu
Coddy logo textTech

オプショナルな検索

CoddyのSwiftジャーニー「ロジックとフロー」セクションの一部 — レッスン 13/56。

辞書のサブスクリプトは常に Optional を返します。キーが存在する場合はその値を、存在しない場合は nil を返します。Swiftでは、これら両方のケースを処理することが強制されます。

let prices: [String: Int] = ["apple": 1, "bread": 3]
let p = prices["apple"]
print(p)                          // Optional(1)

オプショナルを扱うための3つの慣用的な方法。状況に合ったものを選んでください。

1. if let: 両方の分岐を明示的に処理します:

if let p = prices["apple"] {
    print("apple costs \(p)")
} else {
    print("unknown")
}

2. nil結合演算子 ??: インラインでフォールバック(代替値)を提供します:

let p = prices["olive"] ?? 0    // 0

3. デフォルト値付きのサブスクリプト: 結果は同じですが、そのキーに対して書き込みを行う際にもデフォルト値が適用されます:

var counts = ["a": 2]
counts["b", default: 0] += 1   // counts == ["a": 2, "b": 1]
challenge icon

チャレンジ

簡単

辞書 prices が与えられています。ユーザーが購入したいアイテムのカンマ区切りリストを、入力の1行として読み込んでください。

各アイテムについて、入力された順に prices で検索します。アイテムごとに1行ずつ、以下のように出力してください。

  • アイテムが辞書にある場合:<item> @ <price>
  • そうでない場合:<item> not sold

すべてのアイテムをリストした後に、最後の1行として Total: <sum> を出力してください。存在しないアイテムの価格は、nil合体演算子を使用して 0 として扱ってください。

入力が apple,bread,olive,milk の場合、出力は以下のようになります:

apple @ 1
bread @ 3
olive not sold
milk @ 4
Total: 8

チートシート

辞書のサブスクリプトは Optional を返します。キーが存在すればその値を、存在しなければ nil を返します。

1. if let — 両方の分岐を処理します:

if let p = prices["apple"] {
    print("apple costs \(p)")
} else {
    print("unknown")
}

2. Nil合体演算子 ?? — フォールバックを提供します:

let p = prices["olive"] ?? 0    // 0

3. デフォルト値付きサブスクリプト — 書き込み時にも機能するフォールバック:

var counts = ["a": 2]
counts["b", default: 0] += 1   // ["a": 2, "b": 1]

自分で試してみよう

let prices: [String: Int] = ["apple": 1, "bread": 3, "milk": 4]
let items = readLine()!.components(separatedBy: ",")

// TODO: アイテムごとの検索。「@ 価格」または「販売されていません」を表示。?? 0 を使用して合計。
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

ロジックとフローのすべてのレッスン