我有很多选项,并希望有效地检查它们中的任何一个是否为零。
...理想地
super.(variable)
但斯威夫特不会让我这样做。 (类型'S.Generator.Element - > L'不符合协议'NilLiteralConvertible')
选项不能是AnyObjects所以我也不能将其强制转换为NSArray(使用.containsObject)。
我可以写一个for循环,但这看起来很糟糕。有什么建议吗?
答案 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更高效。