Last modified: May 4, 2025
Selectors
necessary for Objective-C compatibility/use
    but also useful in their own right, to add nominative binding capabilities
references to methods by name
    with some amount of compiler checking
selectors can be used to invoke methods
    permitting a degree of flexibility in setup/invocation
used extensively in Cocoa and iOS to match-by-capabilities  
restrictions
class must inherit from NSObject
    necessary for the Obj-C plumbing "underneath"
members must be annotated with @objc
    optional name describes the Obj-C name
usable on methods and property methods
Syntax
#selector obtains method at compile-time
parameter is method with names separated by colons
use getter: or setter: to obtain property getter/setter methods  
class SomeClass: NSObject {
  @objc let property: String
  @objc(doSomethingWithInt:)
  func doSomething(_ x: Int) { }
  init(property: String) { self.property = property }
}
let selectorForMethod = #selector(SomeClass.doSomething(_:))
let selectorForPropertyGetter = #selector(getter: SomeClass.property)