检查nil的选项数组

时间:2015-05-31 15:48:08

标签: swift

我有很多选项,并希望有效地检查它们中的任何一个是否为零。

...理想地

super.(variable)

但斯威夫特不会让我这样做。 (类型'S.Generator.Element - > L'不符合协议'NilLiteralConvertible')

选项不能是AnyObjects所以我也不能将其强制转换为NSArray(使用.containsObject)。

我可以写一个for循环,但这看起来很糟糕。有什么建议吗?

1 个答案:

答案 0 :(得分:4)

有两个func contains<S : SequenceType where S.Generator.Element : Equatable>(seq: S, x: S.Generator.Element) -> Bool func contains<S : SequenceType, L : BooleanType>(seq: S, predicate: @noescape (S.Generator.Element) -> L) -> Bool 函数:

Equatable

第一个将元素作为第二个参数,但是 要求元素符合let optArray : [Int?] = [1, nil, 2] if contains(optArray, { $0 == nil } ) { } 协议,而不是选项的情况。

第二个将谓词作为第二个参数,然后 可以在这里使用:

nil

但是任何解决方案都必须遍历数组,直到$foo = // your flat array of associative arrays // add the top level nodes to an array $result = array(); foreach ($foo as $node) { if ($node['parent-id'] === '') { $node['children'] = array(); array_push($result, $node); } } // recursively iterate this array adding the children addChildrenToArray($result, $foo); function addChildrenToArray(&$array, $children) { $parent_i = 0; $child_i = 0; foreach ($array as $parent_node) { foreach ($children as $child_node) { if ($child_node['parent-id'] == $parent_node['id']) { $child_node['children'] = array(); array_push($array[$parent_i]['children'], $child_node); addChildrenToArray($array[$parent_i]['children'], $children); $child_i++; } } $parent_i++; } } 元素为止 发现,所以上述解决方案可能更好阅读但不是 必须比for-loop更高效