在执行方法之前,更容易检查每个bool?

时间:2013-07-12 14:02:48

标签: iphone ios

是否有更简单,更少的复制/粘贴方式来实现与下面的代码相同的东西?什么是最好的方式?

if (self.title.selectedSegmentIndex !=-1)
{
    [self.form setValue:[self.title titleForSegmentAtIndex:self.title.selectedSegmentIndex] forKey:@"titleKey"];
}
if (self.author.selectedSegmentIndex !=-1)
{
    [self.form setValue:[self.author titleForSegmentAtIndex:self.author.selectedSegmentIndex] forKey:@"authorKey"];
}
if (self.description.selectedSegmentIndex !=-1)
{
    [self.form setValue:[self.description titleForSegmentAtIndex:self.description.selectedSegmentIndex] forKey:@"descriptionKey"];
}
etc....

修改: 对不起它不是bool if语句(我相信我需要这个检查,否则在尝试从索引中获取标题时没有选择任何段时会崩溃)

我觉得我对这些if语句进行了大量的重复检查,并且不知道更好的方法,任何建议都表示赞赏。

2 个答案:

答案 0 :(得分:4)

这种方法有几种方法。 (这里的代码都没有经过测试甚至编译过。)

最明显的是一种简单的方法:

- (void)setFormValueFromSegmentedControl:(UISegmentedControl *)seg forKey:(NSString *)key {
  if (seg.selectedSegmentIndex !=-1) {
    [self.form setValue:[seg titleForSegmentAtIndex:seg.selectedSegmentIndex] forKey:key];
  }
}

现在您的代码简化为:

[self setFormValueFromSegmentedControl:self.title forKey:@"titleKey"];
[self setFormValueFromSegmentedControl:self.author forKey:@"authorKey"];
...

就我个人而言,我喜欢这个,因为用最少的魔法阅读它是如此简单明了。但是,即使那个街区变得笨拙,也有其他解决方案。

你可以做@Cyrille和@ H2CO3之类的建议:

for (NSString *key in [@"title", @"author", ...]) {
  UISegmentedControl *seg = [self valueForKey:key];
  if (seg.selectedSegmentIndex != -1) {
    NSString *formKey = [key stringByAppendingString:@"Key"];
    [self.form setValue:[seg titleForSegmentAtIndex:seg.selectedSegmentIndex] forKey:formKey];
  }
}

您还可以在控件上使用tag来指示它适用于哪个表单键(您可以在IB中配置标记或在代码中使用setTag:)。因此title的标记为0,author的标记为1,等等。

NSArray *formKeyForTag = @[@"titleKey", @"authorKey", ...];
for (UISegmentedControl *seg = [... IBOutletCollection of controls ...]) {
  if (seg.selectedSegmentIndex != -1) {
    NSString *formKey = formKeyForTag[seg.tag];
    [self.form setValue:[seg titleForSegmentAtIndex:seg.selectedSegmentIndex] forKey:formKey];
  }

或者您可以将相关对象添加到分段控件,指向表单键。有关详情,请参阅What is objc_setAssociatedObject() and in what cases should it be used?。 (我碰巧喜欢相关的物品......)

或者您可以使用NSDictionary来保留映射。

有很多选择。但我有点像顶部的简单方法。这是最明显的。

答案 1 :(得分:0)

@protocol ObjectsWithSegmentAtIndex <NSObject>

@property (assign, atomic) NSInteger selectedSegmentIndex;

@end

·H

@interface BaseClass : NSObject    
@property (assign, atomic) id<ObjectsWithSegmentAtIndex> title;
@property (assign, atomic) id<ObjectsWithSegmentAtIndex> description;
...
@property (assign, atomic) Form* form;
@end

的.m

NSString* KeyForValue (id<ObjectsWithSegmentAtIndex> value) {
    return [value description]; // example, not to be used this way
}

+(void) fillForm:(Form*)form withValues:(NSArray*) values {
    for (id<ObjectsWithSegmentAtIndex> value in values) {
        [self fillForm:form withValue:value forKey:KeyForValue(value)];
    }
}

+(void) fillForm:(Form*)form withValue:(id<ObjectsWithSegmentAtIndex>)value forKey:(id<NSCopying>)key {
    if (value.selectedSegmentIndex != kUndefinedSegmentIndex) {
        [form setValue:[value titleForSegmentAtIndex:value.selectedSegmentIndex] forKey:key];
    }
}