Swift NSNumber不是UInt8的子类型

Swift NSNumber不是UInt8的子类型,swift,sprite-kit,skshapenode,Swift,Sprite Kit,Skshapenode,我试图做一些相当简单的SKShapeNode数学来设置形状节点的位置。看起来是这样的: for var i = 0; i < 6; i++ { var pip: Pip = pips[i] // set position let x: CGFloat = tray2.frame.size.width - (i + 1) * pip.frame.size.width - (i + 1) * 2 let y: CGFlo

我试图做一些相当简单的SKShapeNode数学来设置形状节点的位置。看起来是这样的:

    for var i = 0; i < 6; i++ {
        var pip: Pip = pips[i]

        // set position
        let x: CGFloat = tray2.frame.size.width - (i + 1) * pip.frame.size.width - (i + 1) * 2
        let y: CGFloat = tray2.frame.size.height - pip.frame.size.height - 1
        pip.position = CGPointMake(x, y)

        tray2.addChild(pip)
    }
var i=0的
;i<6;i++{
变量pip:pip=pips[i]
//设定位置
设x:CGFloat=tray2.frame.size.width-(i+1)*pip.frame.size.width-(i+1)*2
设y:CGFloat=tray2.frame.size.height-pip.frame.size.height-1
pip.position=CGPointMake(x,y)
tray2.addChild(pip)
}

但是,在“let x…”行中,会产生一个错误:“NSNumber不是UInt8的子类型”。我在这里做错了什么?

将表达式包装在CGFloat初始值设定项中以解决编译器错误

for var i = 0; i < 6; i++ {
    var pip: Pip = pips[i]

    // set position
    let x: CGFloat = CGFloat(tray2.frame.size.width - (i + 1) * pip.frame.size.width - (i + 1) * 2)
    let y: CGFloat = CGFloat(tray2.frame.size.height - pip.frame.size.height - 1)
    pip.position = CGPointMake(x, y)

    tray2.addChild(pip)
}
var i=0的
;i<6;i++{
变量pip:pip=pips[i]
//设定位置
设x:CGFloat=CGFloat(tray2.frame.size.width-(i+1)*pip.frame.size.width-(i+1)*2)
设y:CGFloat=CGFloat(tray2.frame.size.height-pip.frame.size.height-1)
pip.position=CGPointMake(x,y)
tray2.addChild(pip)
}

问题在于不能将整数隐式转换为浮点数。例如:

(i + 1) * pip.frame.size.width
这是无效的,因为
i
Int
i+1
Int
,但
pip.frame.size.width
CGFloat
。这在像Obj-C这样的语言中是有效的,
i
将隐式转换为
CGFloat
,但是Swift没有隐式转换,所以我们必须显式转换

最简单的修复方法是首先将
i
转换为
CGFloat

let floatI = CGFloat(i)
然后

let x = tray2.frame.size.width - (floatI + 1) * pip.frame.size.width - (floatI + 1) * 2

对于变量i:CGFloat=0
不能混合整数和浮点。将多个计算分解为命名良好的中间过程有助于发现错误。作为一种副作用,当其他人(甚至你下个月)阅读代码时,会更好地理解正在做的事情。@BryanChen感谢你的想法,但我不能使我成为浮点,因为我用它从数组中挑选项目。@Zaph这就是解决方案。我基本上把所有这些公式分解成多个小语句,错误就消失了。将此作为答案发布,我将选择它。@Sulthan你是对的。但是在这种情况下,IEEE754保证结果是精确的number.Hm。这不起作用。我复制了你的代码片段,得到了同样的错误。谢谢你,我真的很感激你的想法。我将在它上面玩各种各样的游戏。