以下に示すように実装ファイルで列挙型を宣言し、インターフェイスでそのタイプの変数をPlayerState thePlayerStateとして宣言しました。メソッドで変数を使用しました。しかし、宣言されていないことを示すエラーが表示されます。メソッドでPlayerState型の変数を正しく宣言して使用するにはどうすればよいですか?:
.mファイル内
@implementation View1Controller
typedef enum playerStateTypes
{
PLAYER_OFF,
PLAYER_PLAYING,
PLAYER_PAUSED
} PlayerState;
.hファイル内:
@interface View1Controller : UIViewController {
PlayerState thePlayerState;
.mファイルのいくつかのメソッドで:
-(void)doSomethin{
thePlayerState = PLAYER_OFF;
}
typedef
はヘッダーファイル(またはヘッダーに#import
edされた他のファイル)にある必要があります。そうしないと、コンパイラーはPlayerState
ivarを作成するサイズを認識できません。それ以外は、私には大丈夫に見えます。
Appleは、Swiftなど、コードの互換性を向上させるマクロを提供しています。マクロの使用は次のようになります。
typedef NS_ENUM(NSInteger, PlayerStateType) {
PlayerStateOff,
PlayerStatePlaying,
PlayerStatePaused
};
.h内:
typedef enum {
PlayerStateOff,
PlayerStatePlaying,
PlayerStatePaused
} PlayerState;
現在のプロジェクトでは、NS_ENUM()
またはNS_OPTIONS()
マクロを使用できます。
typedef NS_ENUM(NSUInteger, PlayerState) {
PLAYER_OFF,
PLAYER_PLAYING,
PLAYER_PAUSED
};
NSStringなどのクラスに対してAppleが行う方法は次のとおりです。
ヘッダーファイル:
enum {
PlayerStateOff,
PlayerStatePlaying,
PlayerStatePaused
};
typedef NSInteger PlayerState;
http://developer.Apple.com/ のコーディングガイドラインを参照してください。
NS_OPTIONSまたはNS_ENUMの使用をお勧めします。詳細については、こちらをご覧ください: http://nshipster.com/ns_enum-ns_options/
NS_OPTIONSを使用した独自のコードの例を次に示します。UIViewのレイヤーにサブレイヤー(CALayer)を設定して境界線を作成するユーティリティがあります。
H。ファイル:
typedef NS_OPTIONS(NSUInteger, BSTCMBorder) {
BSTCMBOrderNoBorder = 0,
BSTCMBorderTop = 1 << 0,
BSTCMBorderRight = 1 << 1,
BSTCMBorderBottom = 1 << 2,
BSTCMBOrderLeft = 1 << 3
};
@interface BSTCMBorderUtility : NSObject
+ (void)setBorderOnView:(UIView *)view
border:(BSTCMBorder)border
width:(CGFloat)width
color:(UIColor *)color;
@end
.mファイル:
@implementation BSTCMBorderUtility
+ (void)setBorderOnView:(UIView *)view
border:(BSTCMBorder)border
width:(CGFloat)width
color:(UIColor *)color
{
// Make a left border on the view
if (border & BSTCMBOrderLeft) {
}
// Make a right border on the view
if (border & BSTCMBorderRight) {
}
// Etc
}
@end