1

私はObjective-Cを学んでいますが、今はカテゴリにこだわっています。ここにコードがあります

#import <Foundation/Foundation.h>


    @interface NSMutableArray (NSMutableArrayCategory)

    -(NSMutableArray *)removeLastObject;

    @end

    #import "NSMutableArrayCategory.h"


    @implementation NSMutableArray (NSMutableArrayCategory)

    -(NSMutableArray *)removeLastObject
    {
       return [self removeObjectAtIndex:[self count] - 1];
    }
    @end

問題は私が得ることです

Returning void from a function with incompatible result type 'NSMutableArray' *

ここで何が問題なのですか?

4

3 に答える 3

4

おそらく、 ではなく、 returnremoveLastObjectとして宣言する必要があります。voidNSMutableArray

@interface NSMutableArray (NSMutableArrayCategory)

- (void)removeLastObject;

@end

次に、実装は次のようになります。

- (void)removeLastObject
{
   [self removeObjectAtIndex:[self count] - 1];
}

これは、 の他の変更方法と一致しNSMutableArrayます。

于 2012-08-06T14:30:36.293 に答える
2

根底にある問題は、それremoveLastObjectがすでに定義されていて、あなたが望むことをするということです (そのため、人々はそれを再作成しません)。ただし、ここでの回答の一部は少し紛らわしいですが、カテゴリを使用して既存のメソッドをオーバーライドしても問題ないことを示唆しています (または、少なくともこれを行ってはならないことを明示的に述べないでください)。これをしてはいけません。これは十分に定義されていない動作であり、場合によっては完全に定義されていない動作です。通常、メソッドをオーバーライドするにはサブクラス化する必要があります。

サブクラスなしでこれを行うことができるスウィズリングと呼ばれる高度な手法がありますが、これは非常に専門的で壊れやすい手法であり、一般的な使用には適していません。

ただし、カテゴリを使用して既存のメソッドをオーバーライドする必要はありません。

于 2012-08-06T14:34:43.013 に答える
0

私は目的cに精通していません。しかし、removeObjectAtIndexはvoidを返すと思います。だから私は試してみます

[self removeObjectAtIndex:[self count] -1]; 
return self;

アイテムを削除した後、自己を返します..

于 2012-08-06T14:29:03.743 に答える