Control flow / Conditional statements / switch/case statements

//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)"