'的UIColor&#39!;与' SKColor'不相同

时间:2014-07-10 06:24:31

标签: swift

有人可以解释为什么,如导入定义中所述:

typealias SKColor = UIColor

我收到错误'UIColor!'当我执行以下操作时,与'SKColor'不同?我正要说'我知道UIColor和UIColor之间的区别!'但实际上,也许我真的不明白!

import UIKit
import SpriteKit

func nColours(gradient: [SKColor]) -> Int {
    return gradient.count
}

let gradient = [SKColor.redColor(), SKColor.magentaColor()]
nColours([SKColor.redColor(), SKColor.magentaColor()]) // 2, OK
nColours(gradient) //  <<<<<< Error 
// 'UIColor!' is not identical to 'SKColor' 
实验,我试过这个:

let gradient = [SKColor.redColor(), SKColor.magentaColor()]
let b = (gradient == [SKColor.redColor(), SKColor.magentaColor()]) // <<<<<< Error 
// '[UIColor!]' is not convertible to '_ArrayCastKind'

1 个答案:

答案 0 :(得分:5)

问题在于UIColorUIColor!在技术上是不同的类型 - !代表Implicitly Unwrapped Optional并且在有可选值的地方使用,但是可选的应该是总是有一个值。

似乎从系统框架返回的许多对象使用隐式可选类型,尽管这种用法应该不那么常见,因为框架完全转换为Swift - UIColor.redColor()没有理由返回nil颜色,因此其返回类型将来可能会从SKColor!更改为SKColor

在您的代码示例中,如果您更改let gradient声明以将数组显式声明为类型[SKColor](而不是SKColor!),编译器会愉快地继续:

let gradient : [SKColor] = [SKColor.redColor(), SKColor.magentaColor()]