//lightweight generics are erased at
//runtime: the boxed kind is checked
//through objCType
NSString *describe(NSArray<NSNumber *> *point) {
const char *kind = [point[0] objCType];
if (strcmp(kind, @encode(int)) == 0) {
return @"Point (int, int)";
}
if (strcmp(kind, @encode(double)) == 0) {
return @"Point (float, float)";
}
return @"Unknown";
}
NSArray<NSNumber *> *p1 = @[@3, @4];
NSString *desc1 = describe(p1);
//desc1 is "Point (int, int)"
NSArray<NSNumber *> *p2 = @[@7.1, @4.6];
NSString *desc2 = describe(p2);
//desc2 is "Point (float, float)"