如果swift 2.2及以上版本的数组可能为零,则替换c-loop



因此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)
    }
}

最新更新