我有7个具有相同属性的自定义对象,createDate和modifiedDate。我可以创建一个接受Object1但实际上接受所有7个对象的方法吗?
现在,这有效:
[self setCreateAndModifiedTimeWithEvent:((Object1 *) object2
WithCreateDate:[[eventsArray objectAtIndex:i] objectForKey:@"create_date"]
AndModifiedDate:[[eventsArray objectAtIndex:i] objectForKey:@"modified_date"]];
.h文件
-(void) setCreateAndModifiedTimeWithEvent:(Object1 *)object
WithCreateDate:(NSString *)createStamp
AndModifiedDate:(NSString *)modifiedStamp;
.m文件
-(void) setCreateAndModifiedTimeWithEvent:(Object1 *)object
WithCreateDate:(NSString *)createStamp
AndModifiedDate:(NSString *)modifiedStamp
{
object.A = @"Hello,";
object.B = @"World";
}
这会减少代码行的好处。
我知道你可以用UIView及其子类做这类事情。说我有一个
UITextField myTextField.
我能做到
((UIScrollView *)myTextField).tag = 2;
对于我这样的对象进行类型转换是否有任何内在的不妥之处或是否可以接受?
答案 0 :(得分:3)
就像乔说的那样,你会用这样的事情变得更好:
@interface DatedObject : NSObject
@property NSDate *createDate;
@property NSDate *modifiedDate;
@end
@implementation DatedObject
@synthesize createDate;
@synthesize modifiedDate;
@end
然后让7个类中的每个继承自DatedObject
基类。继承是面向对象编程的基本部分,你应该学会使用它(明智地)。
然后您的方法可以是:
-(void) setCreateAndModifiedTimeWithEvent:(DatedObject *)object
WithCreateDate:(NSString *)createStamp
AndModifiedDate:(NSString *)modifiedStamp;
您也可以使用协议执行此操作,但使用其他类继承的基类的好处是您只需在一个位置实现此功能。如果7个类当前并不都是从相同的基类继承(最终会成为DatedObject的超类),那么协议可能就是这样。在这种情况下,您可以像这样声明您的方法:
-(void) setCreateAndModifiedTimeWithEvent:(id<DatedObjectProtocol>)object
WithCreateDate:(NSString *)createStamp
AndModifiedDate:(NSString *)modifiedStamp;
这两种方法相对于您在问题中发布的方法的一大优势是,您可以从编译器获得更多帮助,以捕获代码向不响应它的对象发送消息的位置。
答案 1 :(得分:1)
安德鲁的回答是正确的。
但是,如果由于某种原因你不想创建公共基类或协议,你总是可以将方法参数的类型设置为id
,如下所示:
-(void) setCreateAndModifiedTimeWithEvent:(id)object
WithCreateDate:(NSString *)createStamp
AndModifiedDate:(NSString *)modifiedStamp;
类型id
的参数在编译时不进行任何类型检查(如NSArray中的值),因此您可以在不生成编译器警告的情况下调用所需的任何方法(如果显示编译器警告,这显然非常危险你不小心。)
你不能在没有强制转换的情况下在id
变量上使用点符号,但最好从id转换为具体类型,而不是从不同的不相关类型转换。
除了你的代码可读性之外,它实际上没有任何区别。