Warum ist das folgende Code-Snippet NUR Drucken blah3 und blah4, aber nicht blah2?NSMutableDictionary isKindOfClass NSDictionary ist falsch
isKindOfClass
soll die Vererbung respektieren, aber genau das scheint genau zu sein.
Obj-C:
NSDictionary *dict = [NSDictionary new];
NSMutableDictionary *mutableDict = [NSMutableDictionary new];
if([dict isKindOfClass:[mutableDict class]]){
NSLog(@"blah"); //does not print (as expected)
}
if([mutableDict isKindOfClass:[dict class]]){
NSLog(@"blah2"); //does not print (unexpected!)
}
if([mutableDict isKindOfClass:[mutableDict class]]){
NSLog(@"blah3"); //prints
}
if([dict isKindOfClass:[dict class]]){
NSLog(@"blah4"); //prints
}
Swift:
var dict = NSDictionary()
var mutableDict = NSMutableDictionary()
if(dict.isKindOfClass(mutableDict.dynamicType)) {print("blah")}
if(mutableDict.isKindOfClass(dict.dynamicType)) {print("blah2")}
if(dict.isKindOfClass(dict.dynamicType)) {print("blah3")}
if(mutableDict.isKindOfClass(mutableDict.dynamicType)) {print("blah4")}
Mit Xcode 7.3.1, IOS 9.3.
Nicht sicher, was Sie sagen. Wenn NSMutableDictionary ein NSDictionary ist, warum sollte blah2 nicht gedruckt werden? – user1366911
Weil Sie gegen 'dict.class' vergleichen. Aber dict ist nicht 'NSDictionary', sondern eine Unterklasse davon. – Eiko
Wie wäre es mit dem Anwendungsfall, wo ich zwei IDs habe und ich möchte überprüfen, ob die Klassen gleich oder eine Unterklasse sind. In diesem Fall muss ich isKindOfClass verwenden. Ich kann nicht direkt mit [NSDictionary-Klasse] vergleichen. Dies ist der Zweck von isKindOfClass, nein? – user1366911