这是运行泛型方法的正确方法吗?

Spa*_*Dog 2 macos cocoa cocoa-touch objective-c ios

我有这个方法应该设置对象的名称,但对象可以是3个类,A,B和C.

如果我只是这样做

[object setName: @"new name"];  //at this point I am treating object as of type id
Run Code Online (Sandbox Code Playgroud)

Xcode会抱怨有多个名为"setName"的方法,然后我就这样做了

  if ([object isKindOfClass:[ClassA class]]) {
    [(ClassA *)object setName:newName];
  } else
  if ([object isKindOfClass:[ClassB class]]) {
    [(ClassB *)object setName:newName];
  } else
    [(ClassC *)object setName:newName];
  }
Run Code Online (Sandbox Code Playgroud)

但这对我来说似乎很蹩脚.

我试图通过使用这样的东西欺骗Xcode

    [(typeof(object))object setName:newName];
Run Code Online (Sandbox Code Playgroud)

但Xcode也不喜欢它,可能是因为它typeof(object)正在返回id,我们又回到了原点.同样的错误.

我有什么更好/更优雅的方法呢?

Jef*_*mas 5

使用A,B和C类都符合的协议.

@protocol MyProtocol <NSObject>
@required
- (void)setName:(NSString *)name;
@end
Run Code Online (Sandbox Code Playgroud)

然后

id<MyProtocol> object = ...
[object setName:newName];
Run Code Online (Sandbox Code Playgroud)