Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios SKShapeNode.fillColor不等于原始UIColor_Ios_Swift_Sprite Kit_Uicolor_Skshapenode - Fatal编程技术网

Ios SKShapeNode.fillColor不等于原始UIColor

Ios SKShapeNode.fillColor不等于原始UIColor,ios,swift,sprite-kit,uicolor,skshapenode,Ios,Swift,Sprite Kit,Uicolor,Skshapenode,我已经浪费了很多时间寻找答案,为什么下面的代码给出的结果不一样: let originalColor = UIColor(red: 0.2, green: 0.2, blue: 0.2, alpha: 1.0) let section = SKShapeNode(path: path.cgPath) section.fillColor = originalColor let isEqual = section.fillColor == originalColor //=> gives fa

我已经浪费了很多时间寻找答案,为什么下面的代码给出的结果不一样:

let originalColor = UIColor(red: 0.2, green: 0.2, blue: 0.2, alpha: 1.0)
let section = SKShapeNode(path: path.cgPath)
section.fillColor = originalColor
let isEqual = section.fillColor == originalColor //=> gives false
我不知道,这有什么不对。我比较了颜色空间和
UIColor
对应的
CGColor
,只有
CGColor
具有不同的
hashValue
。但为什么呢?上面的代码应该是有效的,它非常简单,我在这里遗漏了什么

编辑 我使用了以下代码来比较
UIColor
s:

extension SKColor {

static func !=(lhs: UIColor, rhs: UIColor) -> Bool {
    return !lhs.isEqualTo(rhs)
}

func isEqualTo(_ color: UIColor) -> Bool {
    var red1: CGFloat = 0, green1: CGFloat = 0, blue1: CGFloat = 0, alpha1: CGFloat = 0
    getRed(&red1, green:&green1, blue:&blue1, alpha:&alpha1)

    var red2: CGFloat = 0, green2: CGFloat = 0, blue2: CGFloat = 0, alpha2: CGFloat = 0
    color.getRed(&red2, green:&green2, blue:&blue2, alpha:&alpha2)

    return red1 == red2 && green1 == green2 && blue1 == blue2 && alpha1 == alpha2
}

}
其他一些
UIColor
的比较结果以相同的方式实例化(带有后缀1的红色/绿色/蓝色是形状的
fillColor

(lldb) po red1
0.8784313797950745

(lldb) po red2
0.8784313725490196

(lldb) po green1
0.10196078568696976

(lldb) po green2
 0.10196078431372549

(lldb) po blue1
0.30980393290519714

(lldb) po blue2
0.30980392156862746
尝试更改此选项:

return red1 == red2 && green1 == green2 && blue1 == blue2 && alpha1 == alpha2
为此:

return Float(red1) == Float(red2) && 
    Float(green1) == Float(green2) && 
    Float(blue1) == Float(blue2) && 
    Float(alpha1) == Float(alpha2)

你对UIColor相等的工作原理做了一个很大的假设。这里有一个想法:尝试获取并显式测试颜色的
红色
绿色
蓝色
、和
阿尔法
组件。这样我们比较的是CGfloat,我们知道它是如何工作的。哦哦,还有一点需要考虑:也许你给的颜色在幕后会变成灰色?嘿@matt谢谢你的快速回复:)我已经用上面的代码检查过了-编辑了我的问题,请看一下。它根据
CGFloat
组件给出不同的值。好的,但是现在您面临浮点比较的问题。这些颜色值与7或8个有效数字相同,这远远超出了任何可感知差异的范围。因此,颜色与所有意图和目的相同。这是有效的!:)非常感谢你。然而,在我看来,这似乎是iOS框架甚至Swift中的一个问题——我们看不到苹果框架的内部结构,很难验证。对于相同的比较技术和相同的输入,上述结果是不同的。良好的捕捉@matt,以降低浮动精度。现在结果是一样的:-)我已经尝试过同样的方法来比较实例化的
UIColor
s,但没有分配给
SKShapeNode.fillColor
,并且成功了(在对代码的比较部分进行更改之前):)我仍然想知道,为什么这会发生在
SKShapeNode
实例的
fillColor
属性上。好问题:但我认为我们都有相同的猜测:在幕后,也许颜色实际上是减少到它的浮动当量。-此外,即使UIColor和SKColor是彼此的类型别名,将您的颜色创建为SKColor而不是UIColor会有不同吗?是的,我知道SKColor的别名,但只是为了确保我尝试过UIColor和SKColor-同样的事情。我想,也许在幕后,有一个类名检查,但显然不是这样。