Swift是否支持隐式转换?

时间:2014-07-09 05:11:48

标签: ios swift implicit-conversion primitive-types

例如,我有以下代码:

    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

我收到了错误:

  

'双'不能转换为' UInt8'

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

修改:

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

enter image description here

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

  

'双'不能转换为' UInt8'。

所以我做了转换:

enter image description here

然后问题出在" blockWidth"变量现在。

我再次添加了转换:

enter image description here

错误信息是:

  

键入' UInt8'不符合协议' FloatLiteralCovertible'

最终的工作表达式是:

enter image description here

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

3 个答案:

答案 0 :(得分:33)

Swift没有隐式演员。

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

如果你想让Float从double获得,那么你可以使用Float(doubleValue)和相同的方法,如果你想将float转换为整数,那么你可以使用Int(floatValue)

在你的情况下:

let intValue = UInt8(doubleValue)

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

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

答案 1 :(得分:24)

Swift不支持在Xcode6 GM中隐式强制转换。以下答案仅适用于Xcode6测试版。


我不想谈论隐式演员是好还是坏,但如果你真的想要__conversion()

你可以拥有它

e.g。如果您需要UInt8Int能够转换Double

extension Double {
    func __conversion() -> UInt8 { return UInt8(self) }
    func __conversion() -> Int { return Int(self) }
    // add more if you need to
}

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>

注意:我不会把它放在我的生产代码中。我只想在可能的情况下指出它,但不建议它。

答案 2 :(得分:2)

使用bridgeToObjectiveC()方法,您可以调用Objective-C中提供的方法将一种原始数据类型转换为另一种原始数据类型,例如

variable_name.bridgeToObjectiveC().intValue

会将名为variable_name的变量转换为整数