我刚遇到一些与清晰代码相关的问题。我在项目的许多模块中使用谓词。当我处理核心数据时,NSPredicates对于检索过滤对象非常有帮助。
但是,对于逻辑而言,这种预测是有益的,但是当我使用它时,它不能用于代码可读性。
让我们看一下这个例子:
NSPredicate *predicate = [NSPredicate predicateWithFormat:
@"(ANY option.playerzoneID == %d) \
AND (ANY option.gameId == %@) \
AND (team.teamID == %@) \
AND (league.leagueID == %@) \",
zoneIdType,
SELECTED_GAME.gameID,
SELECTED_TEAM.teamID,
SELECTED_LEAGUE.leagueID];
当我查看这个谓词时,即使我在一周前写过这个谓词,我对这个结构也很困惑。
有关如何使此代码更具可读性的任何建议吗?
我认为这样的事情会更好:
[predicate setParametr:@"gameID == %@", SELECTED_GAME.gameID];
[predicate setParametr:@"league.leagueID == %@", SELECTED_LEAGUE.leagueID];
答案 0 :(得分:3)
您可以浏览以下内容:
+ (NSPredicate *)andPredicateWithSubpredicates:(NSArray *)subpredicates
+ (NSPredicate *)orPredicateWithSubpredicates:(NSArray *)subpredicates
+ (NSPredicate *)notPredicateWithSubpredicate:(NSArray *)subpredicate
有了这个,您实际上可以形成短谓词并将它们与数组连接在一起。所以,你并没有完全得到你想要的东西,但是它几乎可以拍摄。
NSPredicate *predicate1 = [NSPredicate predicateWithFormat:@"(ANY option.playerzoneID == %d)", zoneIdType];
NSPredicate *predicate2 = [NSPredicate predicateWithFormat:@"(ANY option.gameId == %d)", SELECTED_GAME.gameID];
NSPredicate *predicate3 = [NSPredicate predicateWithFormat:@"(ANY team.teamID == %@)", SELECTED_TEAM.teamID];
NSCompoundPredicate *compoundANDPredicate = [NSCompoundPredicate andPredicateWithSubpredicates:@[predicate1, predicate2, predicate3]];
在此处详细了解这些内容:http://nshipster.com/nspredicate/
编辑:使用OR Predicates和AND Predicates:
让我们假设:您将此谓词添加为OR:
NSPredicate *predicate4 = [NSPredicate predicateWithFormat:@"(ANY team.teamName == %@)", SELECTED_TEAM.teamName];
因此,您可以将AND和OR谓词分组为一个复合谓词(compoundANDPredicate
,如上所示),然后使用
+ (NSPredicate *)orPredicateWithSubpredicates:(NSArray *)subpredicates
所以它变成了:
[NSCompoundPredicate orPredicateWithSubpredicates:@[compoundANDPredicate, predicate4]];