子集与超集
本课属于 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:) 在两个集合完全没有共同元素时返回 true:
let evens: Set = [2, 4, 6]
let odds: Set = [1, 3, 5]
evens.isDisjoint(with: odds) // true这三个谓词是表达“所需权限”或“全部满足”/“全部不满足”规则的最简洁方式,无需手动编写循环。
挑战
中等你正在检查某份文档的访问权限。读取三行:
- 用户的权限(用逗号分隔)
- 所需的权限(用逗号分隔)
- 禁止的权限(用逗号分隔)
满足以下条件时,用户可以获得访问权限:
- 用户的权限是所需权限的超集(拥有每一项所需权限)
- 用户的权限与禁止的权限不相交
准确输出以下其中一项:
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: ...
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
逻辑与流程中的所有课
自己练习: Swift 在线编辑器