因此C-loop在swift 2.2中被弃用,并将在swift 3中删除。我反对它,但必须接受它。
我有一个功能如下:
func levelOrder(root: TreeNode?) -> [[Int]] {
guard root != nil else { return [] }
let leftArr = levelOrder(root!.left)
let rightArr = levelOrder(root!.right)
var merged = [[Int]]()
merged.append([root!.val])
for i in 0...max(leftArr.count, rightArr.count)
{
var current = [Int]()
let currentLeft: [Int]? = i < leftArr.count ? leftArr[i] : nil
let currentRight: [Int]? = i < rightArr.count ? rightArr[i] : nil
for var j = 0; j < currentLeft?.count; j++
{
current.append(currentLeft![j])
}
for var j = 0; j < currentRight?.count; j++
{
current.append(currentRight![j])
}
if current.count > 0
{
merged.append(current)
}
}
return merged
}
所以对于内部的for循环,我使用的是c风格的循环,如果currentLeft
为零,那么for循环就永远不会被执行,这是完美的,所以代码是干净优雅的。
现在的问题是,为了使用swift循环,我必须使用if条件来检查数组是否为nil,这很烦人。有没有什么好的解决方案可以在不引入像我这样的if条件的情况下替换c循环?
对于您的用例,最简单的解决方案是使用空数组而不是nil
。
let currentLeft: [Int] = i < leftArr.count ? leftArr[i] : []
let currentRight: [Int] = i < rightArr.count ? rightArr[i] : []
此外,您可能会使用一种更实用的方法:
currentLeft.forEach {
current.append($0)
}
或者只是:
let current = currentLeft + currentRight
为什么不简化和缩短,因为您不需要自己的内部循环:
for i in 0...max(leftArr.count, rightArr.count)
{
var current = [Int]()
if i < leftArr.count {
current.appendContentsOf(leftArr[i])
}
if i < rightArr.count {
current.appendContentsOf(rightArr[i])
}
if current.count > 0
{
merged.append(current)
}
}