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
我得到了错误:
“Double”不能转换为“UInt8”
有没有办法隐式转换数据types(也许只适用于原始数据types)?
编辑:
我知道如何使用Iducoolbuild议的特定types的构造函数来进行显式的转换。 但这对我的问题不是很有帮助,因为我们甚至不知道在哪里添加转换。 我在操场上简化了我的表情:
问题在于“填充”variables,错误信息是
“Double”不能转换为“UInt8”。
所以我做了转换:
那么现在问题在“blockWidth”variables中。
我再次添加了转换:
而错误信息是:
types“UInt8”不符合协议“FloatLiteralCovertible”
最后的工作expression是:
它简单而快捷吗? 我不这么认为。
Swift中没有隐式的投射。
在swift中简单的转换方法是使用特定types的构造函数。
就像如果你想从double获得Float那么你可以使用Float(doubleValue)
和相同的方法,如果你想将float转换为整数,那么你可以使用Int(floatValue)
。
在你的情况下:
let intValue = UInt8(doubleValue)
请注意,小数点后您将失去任何值。 所以,select一个更好的方法。 以上转换只是为了帮助您理解。
请注意,在推断浮点数的types时,Swift总是selectDouble(而不是Float)。
Swift不支持在Xcode6 GM中进行隐式转换。 以下回答仅适用于Xcode6testing版。
我不想谈论隐式转换是好还是坏,但是如果你真的想用__conversion()
例如,如果你需要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>
注意:我不会把这个放在我的生产代码中。 我只想指出,如果可能,但不build议。
使用bridgeToObjectiveC()方法,您可以调用Objective-C中提供的方法将一种基本数据types转换为另一种基本数据types
variable_name.bridgeToObjectiveC().intValue
会将名为variable_name的variables转换为整数