- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有以下对象结构:
动物、狗和猫。如您所料,Dog 和 Cat 是从 Animal 继承而来的。
我有一个农场类(class):
@implementation AnimalFarm
-(Animal*) createAnimal:(AnimalType)type{
switch (type) {
case CAT:
return [Cat new];
case DOG:
return [Dog new];
default:
return [Animal new];
}
}
@end
我尝试进行单元测试:
AnimalFarm *farm = [AnimalFarm new];
Animal *dog = [farm createAnimal:DOG];
Animal *cat = [farm createAnimal:CAT];
STAssertTrue([cat isMemberOfClass:[Cat class]],@"cat is not a cat!");
STAssertTrue([dog isMemberOfClass:[Dog class]],@"Dog is not a dog!");
STAssertTrue([cat isKindOfClass:[Animal class]],@"Cat is not an animal!");
STAssertTrue([dog isKindOfClass:[Animal class]],@"Cat is not an animal!");
类的实现:
@interface Cat : Animal {
}
@end
@implementation Cat
-(NSString*) say{
return @"miau";
}
@end
dog 的实现类似。
但 isKindOfClass 或 isMemberOfClass 都没有像我预期的那样工作....
我错过了什么吗?
当我使用 IF 而不是 switch 时,一切顺利......但有什么区别?
有效的 createAnimal 实现:
-(Animal *) createAnimal:(AnimalType)type {
if (type == DOG) {
return [Dog new];
} else if (type == CAT) {
return [Cat new];
} else {
return [Animal new];
}
最佳答案
isMemberOfClass:
将仅在实例的类完全相同时返回 YES
,但是 isKindOfClass:
将返回 YES
如果实例的类相同,或者是给定类的子类。
例如,这将输出 No!
:
BOOL result = [[NSMutableArray array] isMemberOfClass:[NSArray class]];
NSLog (@"%@", result? @"Yes!" : @"No!");
但这将输出Yes!
:
BOOL result = [[NSMutableArray array] isKindOfClass:[NSArray class]];
NSLog (@"%@", result? @"Yes!" : @"No!");
这是因为 NSMutableArray 是 NSArray 的种类,但它不是 NSArray 类的成员(否则它就不是 NSMutableArray)。
在整个 Foundation 和 Cocoa 中,有许多“类集群”。您可以在 Apple's developer web site 上的文档中阅读更多相关信息.由于类簇的性质,如果您可能创建了一个 NSString
对象,它可能无法通过 isMemberOfClass:[NSString class]
测试。
如果 isKindOfClass:
或 isMemberOfClass:
都没有返回正确的值,请查看实际对象属于哪个类
NSLog(@"cat class = %@, dog class = %@", [cat className], [dog className]);
如果它们返回的不是它们应该返回的任何东西,那么你的农场类就有问题。
关于objective-c - Objective c isKindOfClass 误解?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2045561/
如何确定结构是否属于特定类型?换句话说,如果我得到一个对象,我怎么知道底层类型是一个结构体? +(BOOL)isPrimitive:(id)input { return [input isKi
我有一个方法someMethod。此方法在某些时候具有以下 if-else 条件。 - (void) someMethod { // ... some more code ... if
我只想抓取ScrollView中的按钮标签1~5,其他数据不需要抓取 (void)layoutScrollImages { UIImageView *view = nil; NSArr
我有一个无法理解的问题,我正在使用一个用于使用Map Open Source Map(https://github.com/route-me/route-me)的库,该示例运行完美,并且我相信不是与代
我原以为这是一个身份,但它现在似乎对我不起作用。 看我的 lldb 提示符: po [self class] ==> MyCustomClass po [MyCustomClass 类] ==> My
最新版本的 Objective-C 和 XCode (4.4)。 我有一个代码片段,我不明白为什么我可以使用一些行,让我解释一下: // For understanding purpose : (NS
我创建了一个自定义类AnimalView,它是UIView的子类,包含一个UILabel和一个UIImageView >。 @interface AnimalView : UIView { U
我正在检查 toViewController(我的 tabBar 中的第二个选项卡)是否属于 MatchCenterViewController 类,但是 else 语句正在运行,这告诉我它不属于那个
我有一个 ViewController 和一些供用户输入的标签和文本字段,在某些时候我需要遍历所有文本字段以收集用户的输入。 override func viewDidLoad() { sup
我有一个与 Cocoapods (ECSlidingViewController) 一起安装的库。在代码中,比较是使用 -isKindOfClass 完成的。在调试器中,打印描述和一切都表明这个变量是
有没有比更好的方法来查看一个对象是否具有多个类之一 if ([item isKindOfClass:[NSArray class]] || [item isKindOfClass:[NSNumber
引用下面的代码,我发现 isKindOfClass 无法识别类。 id parent = [self.tableDataSource objectAtIndex:indexPath.row]; //p
出于各种原因,为了使数组的索引与其他事物保持一致,我在数组中加入了[NSNull null]。像这样: NSArray *arr = @[obj1, obj2, obj3, [NSNull null]
有人可以解释为什么 isKindOfClass 会根据实例的创建方式返回不同的结果吗? @interface BaseClass ... @interface DerivedClassA : Base
我的一个单元测试失败了,原因出乎我的意料。似乎对 isKindOfClass 的调用返回了 NO,但是当我调试并单步执行时,似乎没有理由返回 NO。 代码是: if ([self.detailItem
我正在做一个 iOS5+ 项目(xcode 4.4.1 SDK 5.1) 我在单元测试中有这段代码: [_appDelegate application:nil didFinishLaunchingW
Swift 提供了is 关键字(和as?)来检查一个对象是否可以成功向下转型: if foo is MyClass { // ... } 但是NSObjectProtocol也提供了原来的fu
Swift 中的 isKind(of aClass: AnyClass) 和 isMember(of aClass: AnyClass) 函数有什么区别? Objective-C 中的原始问题 Wha
最近升级了 XCode8 我在 isKindOfClass 中遇到问题这段代码一直有效到 iOS9 的方法但在 iOS10突然[items isKindOfClass: [NSMutableArray
我有以下代码来根据 rvc 的类型确定不同的操作: let rvc = UIApplication.sharedApplication().delegate.window?.rootViewCont
我是一名优秀的程序员,十分优秀!