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)

Optional を扱うための、慣用的な3つの方法。状況に合うものを選んでください。

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

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

2. nil-coalescing ??:インラインで代替値を指定します:

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

自分で試してみよう

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

// TODO: アイテムごとのルックアップ; '@ price' または 'not sold' を出力; ?? 0 で合計
quiz icon腕試し

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

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

自分で練習してみよう: Swiftプレイグラウンド