Apple Developer Connection
Advanced Search
Member Login Log In | Not a Member? Contact ADC

< 前ページ次ページ >

拡張

クラス拡張は「匿名」のカテゴリに似ていますが、宣言するメソッドを対応するクラスのメイン@implementationブロックで実装しなければならない点が異なります。

クラスには、パブリックに宣言されたAPIと、そのクラスまたはそのクラスが含まれるフレームワークだけで使用するためのプライベートに宣言された追加のAPIがあるのが一般的です。プライベートヘッダファイル内または上記で説明した実装ファイル内のカテゴリ(または複数のカテゴリ)内でこうしたAPIを宣言できます。これは有効ですが、コンパイラは宣言されたメソッドがすべて実装されていることを検証できません。

たとえば、コンパイラは次の宣言と実装をエラーなしでコンパイルします。

@interface MyObject :NSObject
{
    NSNumber *number;
}
- (NSNumber *)number;
@end
 
@interface MyObject (Setter)
- (void)setNumber:(NSNumber *)newNumber;
@end
 
 
@implementation MyObject
 
- (NSNumber *)number
{
    return number;
}
@end

setNumberメソッドの実装がないことに注意してください。これが実行時に呼び出されると、エラーが発生します。

クラス拡張を使用すると、プライマリクラスの@interfaceブロック内以外の場所でクラスに追加の必須APIを定義できます。次の例を参照してください。

@interface MyObject :NSObject
{
    NSNumber *number;
}
- (NSNumber *)number;
@end
 
@interface MyObject ()
- (void)setNumber:(NSNumber *)newNumber;
@end
 
 
@implementation MyObject
 
- (NSNumber *)number
{
    return number;
}
- (void)setNumber(NSNumber *)newNumber
{
    number = newNumber;
}
@end

次に注意してください。

setNumberメソッドの実装は、クラスのメインの@implementationブロックに必ず含まれていなければなりません(カテゴリ内で実装できません)。そうでなければ、コンパイラからsetNumberのメソッド定義が見つからないという警告が出されます。



< 前ページ次ページ >


Last updated: 2007-10-31




Did this document help you?
Yes: Tell us what works for you.

It’s good, but: Report typos, inaccuracies, and so forth.

It wasn’t helpful: Tell us what would have helped.
Get information on Apple products.
Visit the Apple Store online or at retail locations.
1-800-MY-APPLE

Copyright © 2007 Apple Inc.
All rights reserved. | Terms of use | Privacy Notice