1

私はこの単純な 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 ステートメントで、次の警告が表示されます。

タイプ「CIColor *」のパラメーターに「UIColor *」を送信する互換性のないポインタータイプ

ここで何が間違っていますか?私は書くことができることを知っていますreturn [[Shape alloc] initWithColor:color];が、その場合、Shape代わりにを使用すると、サブクラスに問題が発生しselfますよね?

4

1 に答える 1

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
于 2013-11-03T20:42:15.147 に答える