Ranges also aren't compatible between `-subarrayWithRange:` and `-substringWithRange:`. I don't find it particularly weird, because a range is just a value type that represents a contiguous set of indexes.

It might be helpful to compare with `NSIndexSet`. That's certainly a generic class, but it's fundamentally nothing more than a set of ranges (see `-enumerateRangesUsingBlock:`, for example).

Just as indexes can point to a specific character, line, or array element, a range can point to multiple characters, lines, or array elements.