【问题标题】:how to convert Int32 value to CGFloat in swift?如何快速将 Int32 值转换为 CGFloat?
【发布时间】:2014-11-27 12:36:09
【问题描述】:

这是我的代码。我将两个值传递给 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进行除法。

标签: swift ios8.1 cgfloat int32


【解决方案1】:

要在数值数据类型之间进行转换,请创建目标类型的新实例,并将源值作为参数传递。所以要将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 位。考虑到后者是浮点数和this answer,会有精度损失。如果我错了,请纠正我。
  • 我想知道为什么let x: Int = 1; let y: Int = 2; let progress = CGFloat(x / y) 不适合我。但是,将 x 和 y 单独包装为 CGFloats 有效。
  • @AndrewKirna 无法正常工作是因为它无法编译,还是因为意外结果?在后一种情况下,结果为 0。xyInt,除法被截断,所以 1 / 2 = 0 但是如果将至少一个转换为 CGFloat,则操作数都是 CGFLoat,因此表达式计算到 0.5
  • @Antonio,这是因为意外的结果。但这是有道理的......即使我将结果转换为 CGFloat,我也忘记了所有整数除法都占了结果的底线。换句话说,0 的浮动版本仍然是 0。
  • 表达式需要 37 毫秒进行类型检查(限制:33 毫秒)
【解决方案2】:

只需使用CGFloat's 初始化器将widthheight 显式转换为CGFloat

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

【讨论】:

    猜你喜欢
    • 2015-08-03
    • 1970-01-01
    • 2019-03-30
    • 1970-01-01
    • 2019-01-17
    • 2021-06-04
    • 2010-11-06
    • 1970-01-01
    相关资源
    最近更新 更多