Sets keep unique values and answer membership questions quickly.

Track unique names

incoming
set_membership.swift
Replay: real traced execution (multi-file project)
let incoming = "beta"
var active: Set<String> = ["alpha", "beta"]
let wasActive = active.contains(incoming)
active.insert(incoming)

print("incoming=\(incoming)")
print("wasActive=\(wasActive)")
print("activeCount=\(active.count)")
let incoming = "gamma"
var active: Set<String> = ["alpha", "beta"]
let wasActive = active.contains(incoming)
active.insert(incoming)

print("incoming=\(incoming)")
print("wasActive=\(wasActive)")
print("activeCount=\(active.count)")
let incoming = "alpha"
var active: Set<String> = ["alpha", "beta"]
let wasActive = active.contains(incoming)
active.insert(incoming)

print("incoming=\(incoming)")
print("wasActive=\(wasActive)")
print("activeCount=\(active.count)")
  1. incoming ← beta, active ← ["beta", "alpha"], wasActive ← true

    1let incoming→ beta = "beta"  //@incoming="gamma", "alpha"2var active→ ["beta", "alpha"]: Set<String> = ["alpha", "beta"]3let wasActive→ true = active["beta", "alpha"].contains(incomingbeta)4active["beta", "alpha"].insert(incomingbeta)56print("incoming=\(incomingbeta)")7print("wasActive=\(wasActivetrue)")8print("activeCount=\(active.count2)")
    outputincoming=beta
    wasActive=true
    activeCount=2
  1. incoming ← gamma, active ← ["alpha", "beta"], wasActive ← false

    1let incoming→ gamma = "gamma"2var active→ ["alpha", "beta"]: Set<String> = ["alpha", "beta"]3let wasActive→ false = active["alpha", "beta"].contains(incominggamma)4active→ ["gamma", "alpha", "beta"].insert(incominggamma)56print("incoming=\(incominggamma)")7print("wasActive=\(wasActivefalse)")8print("activeCount=\(active.count3)")
    outputincoming=gamma
    wasActive=false
    activeCount=3
  1. incoming ← alpha, active ← ["alpha", "beta"], wasActive ← true

    1let incoming→ alpha = "alpha"2var active→ ["alpha", "beta"]: Set<String> = ["alpha", "beta"]3let wasActive→ true = active["alpha", "beta"].contains(incomingalpha)4active["alpha", "beta"].insert(incomingalpha)56print("incoming=\(incomingalpha)")7print("wasActive=\(wasActivetrue)")8print("activeCount=\(active.count2)")
    outputincoming=alpha
    wasActive=true
    activeCount=2

Check and Insert

  1. active starts with alpha and beta.
  2. incoming is beta.
  3. contains(incoming) returns true.
  4. insert(incoming) keeps only one beta.
  5. The final set count is still 2. | Incoming | Was active? | Final count | | --- | --- | --- | | beta | true | 2 | | gamma | false | 3 |
sets Use a set when uniqueness matters more than order. `contains` checks membership and `insert` keeps only one copy of each value.

Exercise: set_membership.swift

Check whether an incoming name is active, insert it, and print the final set count