Menu
Coddy logo textTech

部分集合と上位集合

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)            // false

isSuperset(of:) はその逆で、「私はもう一方の集合のすべての要素を含んでいるか?」ということを確認します:

big.isSuperset(of: small)          // true

isDisjoint(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)」のルールを表現するための最もクリーンな方法です。

challenge icon

チャレンジ

中級

ドキュメントへのアクセス権限を確認しています。次の3行を読み込んでください:

  1. ユーザーの権限(カンマ区切り)
  2. 必須の権限(カンマ区切り)
  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: 許可済み | 不足: ... | 禁止: ...
quiz icon腕試し

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

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