为什么这个Swift Playground Printing&循环两次?

时间:2017-08-07 06:09:36

标签: swift xcode8 swift-playground

我无法弄清楚为什么我打印的for循环和所有都在重复。

我可以宣誓在我编写for循环之前他们没有这样做,但我尝试重新启动Xcode;将代码复制到新的游乐场;评论最后几行;和谷歌搜索 - 无济于事。

事实上,prints在第二次被执行之前都被执行了一次,这让我觉得整个事情都被调用了两次,也许这也可以解释循环,但我只是在&#39看看会怎么样。

我正在运行Xcode 8.3.3(8E3004b)(不是开发版本)。

以下是代码,下面是我正在获取的

的屏幕截图
//: I don't see why it's printing everything twice, or why the for loop is looping twice

import UIKit
import PlaygroundSupport


class CustomView: UIView {

    let pathCG: [CGPoint] = [CGPoint(x:50, y:300), CGPoint(x:100, y:350), CGPoint(x:230, y:350), CGPoint(x:230, y:120)]

    override func draw(_ rect: CGRect) {

        print("what the hell")
        print(pathCG)
        print(pathCG.dropLast().count)

        for v in 0...pathCG.dropLast().count {
            let segAngle = vecDirCG(vec: [pathCG[v], pathCG[(v+1) % 4]]) * 180/CGFloat.pi
        }
    }

    // MARK: get direction given two points
    func vecDirCG(vec: [CGPoint]) -> CGFloat {
        return atan2(-vec[1].y + vec[0].y, vec[1].x - vec[0].x)
    }
}

let containerView = CustomView(frame: CGRect(x: 0, y: 0, width: 250, height: 600))
containerView.backgroundColor = UIColor.orange

PlaygroundPage.current.liveView = containerView

printing & looping twice

编辑:这是@ MohammadSadiq的答案之后的更新。它摆脱了双重打印,但双循环似乎仍然存在。但是,更改CGPointpathCG的值只会更改循环的第一个结果,而不会更改第二个结果。现在我注意到,在原始游乐场中注释掉container.backgroundColor行已经修复了(明显的)重复执行(循环),因此我正在考虑这个问题'某种缓存问题。

enter image description here

2 个答案:

答案 0 :(得分:1)

关于override func draw(_ rect: CGRect)

  

首次显示视图或事件时调用此方法   发生使视图的可见部分无效。

你的行

containerView.backgroundColor = UIColor.orange

可能会导致平局再次打电话。

答案 1 :(得分:1)

正如luk2302已经评论过的,在实际应用中,很难预测draw(_:)被调用的次数或次数。游乐场不适合探索draw(_:)的行为。

在游乐场:

import UIKit
import PlaygroundSupport

class CustomView: UIView {

    let pathCG: [CGPoint] = [CGPoint(x:50, y:300), CGPoint(x:100, y:350), CGPoint(x:230, y:350), CGPoint(x:230, y:120)]

    override func draw(_ rect: CGRect) {

        print(pathCG)

        for v in pathCG.indices {
            let segAngle = vecDirCG(vec: [pathCG[v], pathCG[(v+1) % pathCG.count]]) * 180 / .pi
        }
    }

    // MARK: get direction given two points
    func vecDirCG(vec: [CGPoint]) -> CGFloat {
        return atan2(-vec[1].y + vec[0].y, vec[1].x - vec[0].x)
    }
}

let containerView = CustomView(frame: CGRect(x: 0, y: 0, width: 250, height: 600))
print("---------- CustomView created ----------")
containerView.backgroundColor = .orange
print("---------- backgroundColor set ----------")
PlaygroundPage.current.liveView = containerView
print("---------- liveView set ----------")

输出:

draw [(50.0, 300.0), (100.0, 350.0), (230.0, 350.0), (230.0, 120.0)]
---------- CustomView created ----------
draw [(50.0, 300.0), (100.0, 350.0), (230.0, 350.0), (230.0, 120.0)]
---------- backgroundColor set ----------
---------- liveView set ----------

似乎draw(_:)被调用两次,

  • 创建View的新实例时
  • 修改backgroundColor属性

但你不应该认为这种行为与实际应用程序中的行为相同。

在单一视图应用中:

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        let containerView = CustomView(frame: CGRect(x: 0, y: 0, width: 250, height: 600))
        print("---------- CustomView created ----------")
        containerView.backgroundColor = .orange
        print("---------- backgroundColor set ----------")
        self.view!.addSubview(containerView)
        print("---------- addSubview finished ----------")
    }

}

class CustomView: UIView {

    let pathCG: [CGPoint] = [CGPoint(x:50, y:300), CGPoint(x:100, y:350), CGPoint(x:230, y:350), CGPoint(x:230, y:120)]

    override func draw(_ rect: CGRect) {

        print(#function, pathCG)

        for v in pathCG.indices {
            let segAngle = vecDirCG(vec: [pathCG[v], pathCG[(v+1) % pathCG.count]]) * 180 / .pi
        }
    }

    // MARK: get direction given two points
    func vecDirCG(vec: [CGPoint]) -> CGFloat {
        return atan2(-vec[1].y + vec[0].y, vec[1].x - vec[0].x)
    }
}

输出:

---------- CustomView created ----------
---------- backgroundColor set ----------
---------- addSubview finished ----------
draw [(50.0, 300.0), (100.0, 350.0), (230.0, 350.0), (230.0, 120.0)]
draw(_:)完成后,

addSubview仅被调用一次。 (实际上,在上面的代码中,它是在viewDidLoad完成之后调用的。)

游乐场保留了一些中间结果。对于UIView,它会保留绘制的结果。 (这导致draw(_:)被调用。)但是在实际应用中,这种中间结果不会被保留,因此draw(_:)可能不会在相同的位置被调用。