オプショナルな検索
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 // 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チートシート
辞書のサブスクリプトは Optional を返します。キーが存在すればその値を、存在しなければ nil を返します。
1. if let — 両方の分岐を処理します:
if let p = prices["apple"] {
print("apple costs \(p)")
} else {
print("unknown")
}2. Nil合体演算子 ?? — フォールバックを提供します:
let p = prices["olive"] ?? 0 // 03. デフォルト値付きサブスクリプト — 書き込み時にも機能するフォールバック:
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 を使用して合計。
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。