Swift has made a big use of generics through the standard library. Arrays, dictionaries, enums, and more leverage generic types in order to ensure contained types are not swallowed by the language. In order to improve compatibility and interoperability, Apple has introduced lightweight generics to Objective-C.
In Objective-C, for example, arrays can hold any object type:
NSArray * array = @[@"Hello", @1, @{@"key": @2} [NSObject new], [NSNull null]]; [array enumerateObjectsUsingBlock:^(id_Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { // Do something with the object }];
In the previous code, we see id _Nonnull obj
as being the first parameter of our enumeration block. This is very far from being useful as a consumer of the array has no idea what kind of objects are contained. At compile time, it is impossible to enforce a safe usage of the arrays. This is where lightweight generics come in:
NSArray<NSString *...