簡體   English   中英

為什么從Float投射的CGFloat不顯示CGFloat行為?

[英]Why does CGFloat casted from Float not exhibit CGFloat behavior?

我有一個簡單的示例,嘗試繪制一個圓。 下面的這段代碼不會給我一個圓圈。

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

就是上面的代碼:

輸出:

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

我得到了這張 (圓圈在那里)

從Float鑄造的CGFloat與CGFloat之間顯然存在差異。 有人知道它是什么,為什么這種行為在Swift中有用嗎?

在64位平台上, CGFloat (本質上)是Double (64位浮點數),而Float是32位浮點數。

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

並避免所有舍入問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM