我有这个简单的Shape类:
Shape.h
#import <Foundation/Foundation.h>
@interface Shape : NSObject
-(id)initWithColor:(UIColor *)color;
+(instancetype)shapeWithColor:(UIColor *)color;
@end
和Shape.m
#import "Shape.h"
@interface Shape ()
@property (nonatomic, strong) UIColor *color;
@end
@implementation Shape
-(id)init
{
return [self initWithColor:[UIColor whiteColor]];
}
-(id)initWithColor:(UIColor *)color
{
self = [super init];
if (self)
{
_color = color;
}
return self;
}
+(instancetype)shapeWithColor:(UIColor *)color
{
return [[self alloc] initWithColor:color]; // I get the warning here
}
@end
在便捷构造函数的return语句中,我收到以下警告:
不兼容的指针类型将'UIColor *'发送到类型的参数 'CIColor *'
我在这里做错了什么?我知道我可以写return [[Shape alloc] initWithColor:color];
但是在这种情况下,如果我使用Shape
代替self
,我会给我的子类带来问题,对吗?
答案 0 :(得分:2)
编译器很困惑,因为initWithColor:
也是CIImage
的方法,定义为
- (id)initWithColor:(CIColor *)color;
您可以通过cmd单击方法名称轻松验证这一点。您将获得以下下拉列表,表示存在与该名称匹配的多个声明
您可以更改名称或添加显式广播:
return [(Shape *)[self alloc] initWithColor:color];
强制转换将为编译器提供足够的信息以正确地键入检查方法参数,并且不会影响子类化的可能性。
为了进一步阐明最后一个概念,我想强调一下,不会在运行时更改对象类型。这只是一个编译器提示。
return [[Shape alloc] init]; // always returns an object of type Shape
return (Shape *)[[self alloc] init]; // the actual type depends on what self is,
// but the compiler will typecheck against
// Shape