gpt4 book ai didi

swift - 为什么从 Float 转换而来的 CGFloat 不表现出 CGFloat 行为?

转载 作者:可可西里 更新时间:2023-11-01 00:54:13 24 4
gpt4 key购买 nike

我有一个简单的例子,我尝试画一个圆。下面这段代码没有给我一个圆圈。

import UIKit

class PlayingCardView: UIView {

override func draw(_ rect: CGRect) {
if let context = UIGraphicsGetCurrentContext(){

context.addArc(center: CGPoint(x: bounds.midX,
y: bounds.midY), radius: 100.0,
startAngle: 0,
endAngle: CGFloat(2.0*Float.pi),
clockwise: true)

context.setLineWidth(5.0)
UIColor.red.setStroke()
context.strokePath()
print(2.0*CGFloat.pi)
print(CGFloat(2.0*Float.pi))
}
}
}

is what I get使用上面的代码:

输出:

6.283185307179586
6.283185005187988

分别对应于2.0*CGFloat.piCGFloat(2.0*Float.pi)的打印语句。

将代码更新为此(我只将 context.addArc 中的 endAngle 更改为 2.0*CGFloat.pi 而不是 CGFloat(2.0*Float. pi)

import UIKit

class PlayingCardView: UIView {

override func draw(_ rect: CGRect) {
if let context = UIGraphicsGetCurrentContext(){

context.addArc(center: CGPoint(x: bounds.midX,
y: bounds.midY), radius: 100.0,
startAngle: 0,
endAngle: 2.0*CGFloat.pi,
clockwise: true)

context.setLineWidth(5.0)
UIColor.red.setStroke()
context.strokePath()
print(2.0*CGFloat.pi)
print(CGFloat(2.0*Float.pi))
}
}
}

我明白了 drawing (圆圈在那里)

从 Float 和 CGFloat 中转换的 CGFloat 显然是有区别的。有人知道它是什么以及为什么这种行为在 Swift 中有用吗?

最佳答案

在 64 位平台上,CGFloat(本质上)是 Double,一个 64 位 float ,而 Float 是一个32 位 float 。

因此 2.0*Float.pi 是“具有 32 位精度的 2π”,将其转换为 64 位数量 CGFloat 保留值,而不增加精度。

这就是为什么 2.0*CGFloat.pi != CGFloat(2.0*Float.pi)。前者是“64 位精度的 2π”,是您应该传递给绘图函数的内容。

在您的特定情况下,CGFloat(2.0*Float.pi)2.0*CGFloat.pi 小一点点,因此只有一条看不见的短弧是绘制(从弧度 0.0 到大约 -0.00000003)。

对于完整的圆圈,您也可以使用

let radius: CGFloat = 100.0
context.addEllipse(in: CGRect(x: bounds.midX - radius, y: bounds.midY - radius,
width: 2.0 * radius, height: 2.0 * radius))

并避免所有舍入问题。

关于swift - 为什么从 Float 转换而来的 CGFloat 不表现出 CGFloat 行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54957375/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com