如何在Swift中将Int32值转换为CGFloat?

27

这是我的代码。我将两个值传递给 CGRectMake(..) 并得到了一个错误。

let width = CMVideoFormatDescriptionGetDimensions(device.activeFormat.formatDescription as CMVideoFormatDescriptionRef!).width
// return Int32 value

let height = CMVideoFormatDescriptionGetDimensions(device.activeFormat.formatDescription as CMVideoFormatDescriptionRef!).height
// return Int32 value

myLayer?.frame = CGRectMake(0, 0, width, height)
// returns error: '`Int32`' not convertible to `CGFloat`

我该如何将Int32转换为CGFloat以避免返回错误?


直接将 Int 转换为 CGFloat 可能会耗费时间。如果 API 可用,考虑使用不同的方法。例如,您可以从 Int 创建 CGSize,然后执行 let dividedSize = size.applying(.init(scaleX: 0.5, y: 0.5)),而不是将 Int 转换为 CGFloat 进行除法。 - Oleksii Nezhyborets
2个回答

72

要在数值数据类型之间进行转换,请创建目标类型的新实例,将源值作为参数传递。因此,要将 Int32 转换为 CGFloat

let int: Int32 = 10
let cgfloat = CGFloat(int)

在您的情况下,您可以选择以下方法:

let width = CGFloat(CMVideoFormatDescriptionGetDimensions(device.activeFormat.formatDescription as CMVideoFormatDescriptionRef!).width)
let height = CGFloat(CMVideoFormatDescriptionGetDimensions(device.activeFormat.formatDescription as CMVideoFormatDescriptionRef!).height)

myLayer?.frame = CGRectMake(0, 0, width, height)
或者:
let width = CMVideoFormatDescriptionGetDimensions(device.activeFormat.formatDescription as CMVideoFormatDescriptionRef!).width
let height = CMVideoFormatDescriptionGetDimensions(device.activeFormat.formatDescription as CMVideoFormatDescriptionRef!).height

myLayer?.frame = CGRectMake(0, 0, CGFloat(width), CGFloat(height))

请注意,Swift中数字类型之间没有隐式或显式的类型转换,因此您必须使用相同的模式来将Int转换为Int32UInt等。


我想知道,在32位系统上进行这种转换是否安全,其中int32仍然是32位,但CGFloat也是32位。请考虑后者是浮点数且根据此答案,会存在精度损失。如果我错了,请纠正我。 - Yevhen Dubinin
我想知道为什么 let x: Int = 1; let y: Int = 2; let progress = CGFloat(x / y) 对我不起作用。然而,将x和y分别包装为CGFloats却可以工作。 - Andrew Kirna
1
@AndrewKirna不工作是因为它没有编译,还是因为有意外的结果?在后一种情况下,结果为0。xy都是Int,除法截断,所以1/2=0。但是如果您将至少一个转换为CGFloat,则操作数都是CGFLoat,因此表达式计算为0.5。 - Antonio
@Antonio,这是因为结果出乎意料。但这很有道理...我忘记了所有整数除法都会取结果的下限,即使我将结果转换为CGFloat。换句话说,0的浮点版本仍然是0。 - Andrew Kirna
表达式类型检查花费了37毫秒(限制:33毫秒)。 - Anton Duzenko

3

只需使用 CGFloat 的初始化方法,明确将 widthheight 转换为 CGFloat 类型:

myLayer?.frame = CGRectMake(0, 0, CGFloat(width), CGFloat(height))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接