Menu
CoddyTech

子集与超集

本课属于 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:) 在两个集合完全没有共同元素时返回 true:

let evens: Set = [2, 4, 6]
let odds:  Set = [1, 3, 5]
evens.isDisjoint(with: odds)       // true

这三个谓词是表达“所需权限”或“全部满足”/“全部不满足”规则的最简洁方式,无需手动编写循环。

challenge icon

挑战

中等

你正在检查某份文档的访问权限。读取三行:

  1. 用户的权限(用逗号分隔)
  2. 所需的权限(用逗号分隔)
  3. 禁止的权限(用逗号分隔)

满足以下条件时,用户可以获得访问权限:

  • 用户的权限是所需权限的超集(拥有每一项所需权限)
  • 用户的权限与禁止的权限不相交

准确输出以下其中一项:

  • granted
  • 缺少所需权限时输出 missing: <...>(排序后用逗号分隔)。即使用户也拥有禁止的权限,也要输出这一项。
  • 没有缺少所需权限,但用户拥有禁止的权限时输出 forbidden: <...>(排序后用逗号分隔)

对于输入 read,write,admin / read,write / delete,输出为 granted。

对于输入 read / read,write / delete,输出为 missing: write。

亲手试试

let user = Set(readLine()!.components(separatedBy: ","))
let required = Set(readLine()!.components(separatedBy: ","))
let forbidden = Set(readLine()!.components(separatedBy: ","))

// TODO: granted | missing: ... | forbidden: ...
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

逻辑与流程中的所有课

自己练习: Swift 在线编辑器