有人可以解释为什么,如导入定义中所述:
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'
答案 0 :(得分:5)
问题在于UIColor
和UIColor!
在技术上是不同的类型 - !
代表Implicitly Unwrapped Optional并且在有可选值的地方使用,但是可选的应该是总是有一个值。
似乎从系统框架返回的许多对象使用隐式可选类型,尽管这种用法应该不那么常见,因为框架完全转换为Swift - UIColor.redColor()没有理由返回nil颜色,因此其返回类型将来可能会从SKColor!
更改为SKColor
。
在您的代码示例中,如果您更改let gradient
声明以将数组显式声明为类型[SKColor]
(而不是SKColor!
),编译器会愉快地继续:
let gradient : [SKColor] = [SKColor.redColor(), SKColor.magentaColor()]