【发布时间】:2014-08-30 00:19:38
【问题描述】:
例如,我有以下代码:
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'
有没有办法隐式转换数据类型(可能只针对原始数据类型)?
编辑:
我知道如何使用Iducool 建议的特定类型的构造函数进行显式转换。但这对我的问题没有太大帮助,因为我们甚至不知道在哪里添加转换。我在操场上简化了我的表达:
问题出在“padding”变量中,错误信息是
'Double' 不能转换为 'UInt8'。
所以我做了转换:
那么问题出在“blockWidth”变量中。
我再次添加了转换:
错误信息是:
类型“UInt8”不符合协议“FloatLiteralCovertible”
最终的工作表达式是:
简单快捷吗?我不这么认为。
【问题讨论】:
-
Apple 非常明确地表示 Swift 中没有隐式类型转换,并且也相当公开和明确地说明了原因。消除隐式类型转换至少可以消除一类常见(并且可能难以找到)的错误。
-
@David Swift Foundation 框架中有很多隐式类型转换。例如
Array/NSArray,Int/NSNumber. -
至少在 Array/NSArray 的情况下它们没有被转换,它们被桥接。一个数组就是一个 NSArray,它有一个 isa 插槽和一切。发生的其他基金会桥接也是如此。即便如此,在大多数情况下,您最终还是不得不显式地转换它以使其有用。在 Int/NSNumber 的情况下,它只在非常特定的语义情况下完成,并且与 Swift 的许多丑陋一样,是因为试图保持 Objective-C 兼容性。从很多方面来看,他们似乎拥有一门非常干净的语言,然后决定将 Objective-C 兼容性移植到它上面。
-
我编辑了这个问题,从标题和正文中删除了高度主观的语言 - 问题本身很好,但我建议不要使用看似具有挑衅性的措辞。
-
我喜欢swift,因为它的语法简洁明了,这样我就可以为复杂的情况编写优雅的代码。但是对于这样一个简单的案例,Swift 让它变得如此困难。我并不是说隐式转换适用于所有情况。但是,如果它至少支持原始数据类型的隐式转换,它将使程序员的生活更轻松。
标签: ios swift implicit-conversion primitive-types