例如,我有以下代码:
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所示。但这对我的问题没什么大帮助,因为我们甚至都不知道在哪里添加转换。我简化了我在游乐场的表达:
问题在于"填充"变量,错误信息是
'双'不能转换为' UInt8'。
所以我做了转换:
然后问题出在" blockWidth"变量现在。
我再次添加了转换:
错误信息是:
键入' UInt8'不符合协议' FloatLiteralCovertible'
最终的工作表达式是:
简单快捷吗?我不这么认为。
答案 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。如果您需要UInt8
且Int
能够转换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的变量转换为整数