WWDC 学习笔记 Embracing Algorithms

Embracing Algorithm

wwdc2018
session

  • Dave Abrahams

Dave and Crusty

这位老兄每次都要装作自己很无知的样子。Crusty 就是哪位指点迷津的扫地僧。
于是我们的 Dave 又遇到问题了。

Delete Selection

这位老兄对图形情有独钟,每次都拿形状举例子。这次做了个各种形状层叠的App。

第一段代码功能很简单,从图形数组中,删除选中的形状。

embalg01.png
extension Canvas {
    mutating func deleteSelection() {
        for i in 0..

这段代码的问题是,要删除的图形如果不是数组的最后一个元素,i 执行到 count - 1 时,数据就会越界。

于是,Dave 将代码修改如下:

extension Canvas {
    mutating� func deleteSelection() {
        var i = 0
        while i < shapes.count {
            if shapes[i].isSelected {
                shapes.remove(at: i)
            }
            i += 1
        }
    }
}
whilebug.png

这段代码也有 bug,如果两个要删的元素(绿色块)连在一起,第二个绿会,会被忽略。

于是要在 if 后面避免这种情况,如下:

extension Canvas {
    mutating� func deleteSelection() {
        var i = 0
        while i < shapes.count {
            if shapes[i].isSelected {
                shapes.remove(at: i)
            } else {
                i += 1
            }
        }
    }
}

写一个看似简单的功能,也有挺大的认知负担。

你可能感兴趣的:(WWDC 学习笔记 Embracing Algorithms)