No *_*ing 5 enums objective-c ios
我有一些UIPopoverViewControllers消息传递委托UIViewControllers传递UI事件.我没有为每个事件编写单独的方法,而是在委托中有一个方法,它有一个switch语句,它根据传递的常量确定如何处理事件(例如下面的例子).
这可能是糟糕的设计,但这是我想出来的.我已经看到关于枚举或静态类的这个问题,但是不理解答案.
So..is我在做什么坏,是有办法,我可以在一个地方定义枚举,这样我就不必维护多个代码位,可以很容易地得到不同步?
编辑好的,多挖一点(这里 + 这里)我看到我可能在正确的轨道上.所以我想我需要知道implementationiOS中文件的位置和位置.
enum {
kSetPlaybackType = 0,
kSetAllNotesOn,
kSetAllNotesOff,
kSetVelocity,
kSetDuration
};
- (void)barPropertyAction:(int)action withParam:(NSNumber *)param
{
switch (action) {
case kSetPlaybackType:
playbackType = [param intValue];
if (playbackType == kPalindrome){
palindromeDirection = kPalindromeUp;
}
break;
case kSetAllNotesOn:
for (BarNote* note in self.barNoteArray) {
note.noteOn = YES;
}
[self.bar updateWindows];
break;
case kSetAllNotesOff:
for (BarNote* note in self.barNoteArray) {
note.noteOn = NO;
}
[self.bar updateWindows];
break;
case kSetVelocity:
for (BarNote* note in self.barNoteArray) {
note.velocity = [param intValue];
}
break;
case kSetDuration:
for (BarNote* note in self.barNoteArray) {
note.duration = [param floatValue];
}
break;
default:
break;
}
}
Run Code Online (Sandbox Code Playgroud)
Pet*_*r M 15
我不会说你的方法是那么糟糕,但它确实对"神"方法的起始胚胎有轻微的感觉 - 这是一种试图做所有事情的方法.但是,对于代码中的选择数量,我会说它完全没问题.
但是分享枚举很简单.只需将它们放在自己的.h文件中,然后将其导入需要的地方.您可以将.h文件作为"C&C++"部分下的文件类型之一.
你引用的问题是基于C#,他们用那种语言做的一件事是设计相当于.h文件,只需使用"using"语句来找到正确的符号.在Objective-C中(如在C和C++中),您必须做更多的手动工作才能实现相同的目标.
顺便说一句,我会把枚举更多地打扮成:
typedef enum {
kSetPlaybackType = 0,
kSetAllNotesOn,
kSetAllNotesOff,
kSetVelocity,
kSetDuration
} SetEnumType;
Run Code Online (Sandbox Code Playgroud)
通过在typedef中声明枚举,您可以声明该类型的变量.即代替:
int varName = kSetAllNotesOn;
Run Code Online (Sandbox Code Playgroud)
你可以说:
SetEnumType varName = kSetAllNotesOn;
Run Code Online (Sandbox Code Playgroud)
这为XCode提供了额外的提示,当您向自己提供自动完成选项时,它会使其在语义上更好地作为一个人阅读,因为您知道这varName是为了保存枚举,而不仅仅是任何旧数字.
缺点是您可能需要在枚举类型和int类型之间显式地转换varNum,具体取决于您正在执行的操作.
但是我不确定你是否可以声明你的方法签名
- (void)barPropertyAction:(SetEnumType)action withParam:(NSNumber *)param
Run Code Online (Sandbox Code Playgroud)
我猜你应该能够(因为我认为枚举是由int支持的).但如果你做不到,那你就是最好的
- (void)barPropertyAction:(int)action withParam:(NSNumber *)param
{
switch ((SetEnumType)action) {
case kSetPlaybackType:
playbackType = [param intValue];
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7713 次 |
| 最近记录: |