创建动态if语句

时间:2014-03-18 17:19:53

标签: ios objective-c if-statement

我正在构建应用程序并遇到了一些我无法解决的问题。它的要点是我有一个允许用户关闭/打开过滤器的视图。我目前将这些过滤器链接到名为Filter的NSObject。过滤器对象具有以下属性:

@property (nonatomic, strong) NSString *activity;
@property (nonatomic, strong) NSString *mileage;
@property (nonatomic, assign) BOOL pets;
@property (nonatomic, assign) BOOL accessibility;
@property (nonatomic, assign) BOOL fee;

以下是过滤视图的外观:

enter image description here

然后我有包含以下属性的Trail对象:

@property (nonatomic, strong) NSString *name;
@property (nonatomic, strong) NSMutableArray *activities;
@property (nonatomic, strong) NSString *miles;
@property (nonatomic, assign) BOOL pets;
@property (nonatomic, assign) BOOL accessibility;
@property (nonatomic, assign) BOOL fee;

我遇到问题以某种方式创建动态if语句,以便在某些过滤器打开或不打开nil(比如活动,宠物,里程)时,for循环将遍历我的所有跟踪对象并比较它们的属性到选定的过滤器。如果Trail对象'过滤器(在此示例中为活动,宠物和里程)与过滤器对象不匹配,然后它们不会添加到新阵列中。所以我无法解决的问题是创建一个只包含已打开过滤器的if语句:

if( (selectedFilter1 == trailProperty1) && (selectedFilter2 == trailProperty2) etc...)

5 个答案:

答案 0 :(得分:2)

最好是你有5个额外的布尔值,你有你的开关的状态,并有类似的东西

BOOL match = true;
if (filterOn1)
{
    match &= (selectedFilter1 == trailProperty1);
}
if (filterOn2)
{
    match &= (selectedFilter2 == trailProperty2);
}
...

我假设trailPropertyX是迭代循环中当前项的值

答案 1 :(得分:1)

我认为问题出在您的Filter对象上。我能想到你可以做的两件事:

  1. 再添加5个BOOL以跟踪是否应该应用过滤器。编辑:有关详细信息,请参阅Merlevede的答案。

  2. Filter的所有属性更改为NSString,并将值设置为@"Deactivated"或其他一些特殊字符串,以跟踪它不应该是用过的。然后,在for循环中,检查给定值是否为"已取消激活"串。如果不是,请在Trail对象上应用过滤器。

  3. 我无法真正看到选择一种方法而不是另一种方法的理由 - 实际上我认为我可能在我的项目中使用这两种方法,这取决于我在编写该部分时的心情。你可以随便挑选一套更舒服的东西。

答案 2 :(得分:1)

无法无法检查所有5个过滤器对象的属性开/关状态(由UISwitch表示),因为在运行时你不会# 39;不知道用户是否已打开任何或所有属性。

答案 3 :(得分:1)

我和一个合作伙伴一起开展了一个项目,我们遇到了类似的问题:按照他们的名字,代码,状态,等级等搜索大学列表(你必须能够打开或关闭某些过滤器)所以有一个解决方案,你的动态 - 但它不是那么简单(或者至少我们的解决方案不是,我希望它不是最令人困惑的)

所以这是解决方案:您的预告片类可以有一系列标准(另一个类),每个标准都有选择的选项,即:允许携带宠物:是/否及其名称(PetFilter)之后您的预告片(其中)我猜你有一个NSMutableArray或类似的循环通过Criteria数组递归。根据用户是否选择使用过滤器来添加Critera。循环如何工作:如果过滤器不是nil,那么使用过滤器来比较所有预告片,如果预告片与从阵列中删除的标准不匹配并继续到下一个标准(如果已设置)因此离开你有结果。每个标准都使用确定的比较方法。我希望这会给你一些想法!

答案 4 :(得分:1)

序列:

if((!filterPetsOn || filterPets == trail.pets) &&
   (!filterBikingOn || filterBiking == trail.biking) &&
   ...)

应该做你想要的。