A static unordered collection of unique objects.
SDKs
- iOS 2.0+
- macOS 10.0+
- Mac Catalyst 13.0+
- tvOS 9.0+
- watchOS 2.0+
Framework
- Foundation
Declaration
@interface NSSet<__covariant ObjectType> : NSObject
Overview
The NSSet
, NSMutable
, and NSCounted
classes declare the programmatic interface to an unordered collection of objects.
NSSet
declares the programmatic interface for static sets of distinct objects. You establish a static set’s entries when it’s created, and thereafter the entries can’t be modified. NSMutable
, on the other hand, declares a programmatic interface for dynamic sets of distinct objects. A dynamic—or mutable—set allows the addition and deletion of entries at any time, automatically allocating memory as needed.
You can use sets as an alternative to arrays when the order of elements isn’t important and performance in testing whether an object is contained in the set is a consideration—while arrays are ordered, testing for membership is slower than with sets.
NSSet
is “toll-free bridged” with its Core Foundation counterpart, CFSet
. See Toll-Free Bridging for more information on toll-free bridging.
Subclassing Notes
There should be little need of subclassing. If you need to customize behavior, it is often better to consider composition instead of subclassing.
Methods to Override
In a subclass, you must override all of its primitive methods:
Alternatives to Subclassing
Before making a custom class of NSSet
, investigate NSHash
and the corresponding Core Foundation type, CFSet. Because NSSet
and CFSet
are “toll-free bridged,” you can substitute a CFSet
object for a NSSet
object in your code (with appropriate casting). Although they are corresponding types, CFSet
and NSSet
do not have identical interfaces or implementations, and you can sometimes do things with CFSet
that you cannot easily do with NSSet
.
If the behavior you want to add supplements that of the existing class, you could write a category on NSSet
. Keep in mind, however, that this category will be in effect for all instances of NSSet
that you use, and this might have unintended consequences. Alternatively, you could use composition to achieve the desired behavior.