Home » Swift » If condition failing with expression too complex

If condition failing with expression too complex

Posted by: admin November 30, 2017 Leave a comment

Questions:

I have a conditional statement that claims the ‘Expression was too complex to be solved in reasonable time. If there are any more than around 5 contains statements in my conditional, it fails with that error. This does not seem like something that should be happening on compile, seeing as the statement isn’t all that complex. Is this a bug that anyone else has run into? Is there a solution other than splitting up my conditions?

else if(
                contains(JSONDict.keys.array, "id") &&
                contains(JSONDict.keys.array, "part_number") &&
                contains(JSONDict.keys.array, "sales_part_number") &&
                contains(JSONDict.keys.array, "include_in_search") &&
                contains(JSONDict.keys.array, "description") &&
                contains(JSONDict.keys.array, "brand") &&
                contains(JSONDict.keys.array, "product_group") &&
                contains(JSONDict.keys.array, "product_design") &&
                contains(JSONDict.keys.array, "material") &&
                contains(JSONDict.keys.array, "line") &&
                contains(JSONDict.keys.array, "unit_of_mass") &&
                contains(JSONDict.keys.array, "coating") &&
                contains(JSONDict.keys.array, "pcs_converstion") &&
                contains(JSONDict.keys.array, "appRim") &&
                contains(JSONDict.keys.array, "appSegment") &&
                contains(JSONDict.keys.array, "series") &&
                contains(JSONDict.keys.array, "product_application")
                ){

            }
Answers:

Yes that’s a known issue – see also this answer.

The solution is to store the logical expression into a variable, using a multiline statement:

else {
    var logicalExpression = contains(JSONDict.keys.array, "id") &&
            contains(JSONDict.keys.array, "part_number") &&
            contains(JSONDict.keys.array, "sales_part_number") &&
            contains(JSONDict.keys.array, "include_in_search")
    logicalExpression = logicalExpression && contains(JSONDict.keys.array, "description") &&
            contains(JSONDict.keys.array, "brand") &&
            contains(JSONDict.keys.array, "product_group") &&
            contains(JSONDict.keys.array, "product_design")
    // ... etc.
    if logicalExpression {
    }
}

A little weird for such a powerful language… but it’s a (hopefully temporary) trade off.