Objective-C deep clone and recursive dictionary merge

Objective-C
#import <Foundation/Foundation.h>
static id DeepClone(id v) {
    if ([v isKindOfClass:NSDictionary.class]) {
        NSMutableDictionary *out = [NSMutableDictionary dictionary];
        for (id k in v) out[k] = DeepClone(((NSDictionary *)v)[k]);
        return out;
    }
    if ([v isKindOfClass:NSArray.class]) {
        NSMutableArray *out = [NSMutableArray array];
        for (id e in v) [out addObject:DeepClone(e)];
        return out;
    }
    return [v copy];
}
static id DeepMerge(id base, id over) {
    if (![base isKindOfClass:NSDictionary.class] || ![over isKindOfClass:NSDictionary.class])
        return over ? DeepClone(over) : DeepClone(base);
    NSMutableDictionary *out = DeepClone(base);
    for (id k in over) out[k] = DeepMerge(out[k], ((NSDictionary *)over)[k]);
    return out;
}