部分集合と上位集合
CoddyのSwiftジャーニー「ロジックとフロー」セクションの一部 — レッスン 21/56。
集合を結合するだけでなく、それらを比較することもできます。
isSubset(of:) は、「自分自身のすべての要素が、もう一方の集合にも含まれているか?」という問いに答えます。
let small: Set = [1, 2]
let big: Set = [1, 2, 3, 4]
small.isSubset(of: big) // true
big.isSubset(of: small) // falseisSuperset(of:) はその逆で、「私はもう一方の集合のすべての要素を含んでいるか?」ということを確認します:
big.isSuperset(of: small) // trueisDisjoint(with:) は、2つの集合に共通の要素がまったくない場合に true を返します:
let evens: Set = [2, 4, 6]
let odds: Set = [1, 3, 5]
evens.isDisjoint(with: odds) // trueこれらの3つの述語は、手動でループを記述することなく、「必要な権限」や「すべて(all-of)」/「なし(none-of)」のルールを表現するための最もクリーンな方法です。
チャレンジ
中級ドキュメントへのアクセス権限を確認しています。次の3行を読み込んでください:
- ユーザーの権限(カンマ区切り)
- 必須の権限(カンマ区切り)
- 禁止されている権限(カンマ区切り)
以下の条件を満たす場合、ユーザーにアクセスが許可されます:
- ユーザーの権限が必須の権限のスーパーセット(超集合)である(すべての必須権限を保持している)
- ユーザーの権限と禁止されている権限が互いに素(共通要素を持たない)である
以下のいずれか1つを正確に出力してください:
granted- 必須の権限が不足している場合は
missing: <...>(ソート済み、カンマ区切り)。禁止されている権限を保持している場合でも、こちらを優先して出力してください。 - 不足している必須権限はないが、禁止されている権限を保持している場合は
forbidden: <...>(ソート済み、カンマ区切り)
入力が read,write,admin / read,write / delete の場合、出力は granted です。
入力が read / read,write / delete の場合、出力は missing: write です。
チートシート
Swiftにおける集合(Set)の比較メソッド:
let small: Set = [1, 2]
let big: Set = [1, 2, 3, 4]
small.isSubset(of: big) // true – smallのすべての要素がbigに含まれています
big.isSuperset(of: small) // true – bigはsmallのすべての要素を含んでいます
let evens: Set = [2, 4, 6]
let odds: Set = [1, 3, 5]
evens.isDisjoint(with: odds) // true – 共通の要素がありません自分で試してみよう
let user = Set(readLine()!.components(separatedBy: ","))
let required = Set(readLine()!.components(separatedBy: ","))
let forbidden = Set(readLine()!.components(separatedBy: ","))
// TODO: 許可済み | 不足: ... | 禁止: ...
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。