オプショナルな検索
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 // 03. デフォルト値付きのサブスクリプト:結果は同じですが、そのキーに書き戻す場合もデフォルト値が保持されます:
var counts = ["a": 2]
counts["b", default: 0] += 1 // counts == ["a": 2, "b": 1]チャレンジ
簡単辞書 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 で合計
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
ロジックとフローのすべてのレッスン
自分で練習してみよう: Swiftプレイグラウンド