Swift是否支持隐式转换?

Bag*_*yer 29 primitive-types implicit-conversion ios swift

例如,我有以下代码:

    let numberOfBlocks = 3
    let blockWidth = SKSpriteNode(imageNamed: "image.png").size.width
    let padding = 20.0

    let offsetX : Float = (self.frame.size.width - (blockWidth * numberOfBlocks + padding * (numberOfBlocks-1))) / 2
Run Code Online (Sandbox Code Playgroud)

我收到了错误:

'Double'不能转换为'UInt8'

有没有办法隐式转换数据类型(可能只对原始数据类型)?

编辑:

我知道如何通过使用Iducool建议的特定类型的构造函数来进行显式转换.但这对我的问题没什么大帮助,因为我们甚至不知道在哪里添加转换.我简化了我在游乐场的表达:

在此输入图像描述

问题出在"填充"变量,错误信息是

'Double'不能转换为'UInt8'.

所以我做了转换:

在此输入图像描述

那么现在的问题是"blockWidth"变量.

我再次添加了转换:

在此输入图像描述

错误信息是:

类型'UInt8'不符合协议'FloatLiteralCovertible'

最终的工作表达式是:

在此输入图像描述

它简单快捷吗?我不这么认为.

Idu*_*ool 34

在Swift中没有隐式转换.

在swift中转换的简单方法是使用特定类型的构造函数.

就像你想让Float从double获得然后你可以使用Float(doubleValue)和相同的方式如果你想将float转换为整数然后你可以使用Int(floatValue).

在你的情况下:

let intValue = UInt8(doubleValue)
Run Code Online (Sandbox Code Playgroud)

请注意,小数点后您将丢失任何值.所以,选择一种更好的方式.以上转换只是为了帮助您理解.

请注意,Swift在推断浮点数的类型时总是选择Double(而不是Float).

  • 最后一句是非常重要的提示,因此我通常在SpriteKit中使用Double作为数据类型来简化转换.顺便说一下,CGFloat是Double而不是Float. (3认同)

Bry*_*hen 26

Swift不再支持Xcode6 GM中的隐式转换.以下答案仅适用于Xcode6 beta版.


我不想谈论隐式演员的好坏,但如果你真的想要,你可以拥有它 __conversion()

例如,如果您需要UInt8并且Int能够转换Double

extension Double {
    func __conversion() -> UInt8 { return UInt8(self) }
    func __conversion() -> Int { return Int(self) }
    // add more if you need to
}
Run Code Online (Sandbox Code Playgroud)
xcrun swift
Welcome to Swift!  Type :help for assistance.
  1> extension Double {
  2.     func __conversion() -> UInt8 { return UInt8(self) }
  3. }
  4> var d = 1.0
d: Double = 1
  5> var u8 : UInt8 = d
u8: UInt8 = 1
  6>
Run Code Online (Sandbox Code Playgroud)

注意:我不会将它放在我的生产代码中.我只想指出它,如果可能,但不建议它.

  • 很棒的发现,但我敢打赌这在 Swift 1.0 中是不可能的(或者如果是,它可能只是使用较少的私有 API)。不过,我希望能够做到这一点;极其小心和适度使用时的强大功能。 (2认同)