我有这段代码可创建视图并对其应用渐变。
import UIKit import QuartzCore let rect : CGRect = CGRectMake(0,0,320,100) var vista : UIView = UIView(frame: rect) let gradient : CAGradientLayer = CAGradientLayer() gradient.frame = vista.bounds let cor1 = UIColor.blackColor() let cor2 = UIColor.whiteColor() let arrayColors = [cor1.CGColor, cor2.CGColor] gradient.colors = arrayColors view.layer.insertSublayer(gradient, atIndex:0)
Xcode没有给我任何编译错误,但是代码崩溃了
let arrayColors = [cor1.CGColor, cor2.CGColor]
与消息 数组元素不能桥接到Objective-C
实际上,我原以为它会在那里崩溃,因为我不确定如何在Swift上创建CGColors数组。令人惊讶的是Xcode提到了Objective-C。在我看来,我正在迅速创建CGColorRef …
有什么线索吗?为什么提到Objective-C,我该如何解决?
之所以提到Objective-C是因为UIKit和QuartzCore是Objective-C框架。特别是,gradient.colors = arrayColors正在调用需要一个的Objective-C方法NSArray。
gradient.colors = arrayColors
NSArray
这似乎是一个错误,因为Apple的文档表明,NSArray只要可以考虑数组中的项目,数组就应该自动桥接到AnyObject:
AnyObject
从Swift数组桥接到NSArray对象时,Swift数组中的元素必须与AnyObject兼容。例如,类型为Int []的Swift数组包含Int结构元素。Int类型不是类的实例,但是因为Int类型桥接到NSNumber类,所以Int类型与AnyObject兼容。因此,您可以将Int []类型的Swift数组桥接到NSArray对象。如果Swift数组中的元素不兼容AnyObject,则桥接到NSArray对象时会发生运行时错误。 您也可以遵循上述相同的桥接规则,直接从Swift数组文字创建NSArray对象。当您显式地键入一个常量或变量作为NSArray对象并为其分配数组常量时,Swift将创建一个NSArray对象而不是Swift数组。
从Swift数组桥接到NSArray对象时,Swift数组中的元素必须与AnyObject兼容。例如,类型为Int []的Swift数组包含Int结构元素。Int类型不是类的实例,但是因为Int类型桥接到NSNumber类,所以Int类型与AnyObject兼容。因此,您可以将Int []类型的Swift数组桥接到NSArray对象。如果Swift数组中的元素不兼容AnyObject,则桥接到NSArray对象时会发生运行时错误。
您也可以遵循上述相同的桥接规则,直接从Swift数组文字创建NSArray对象。当您显式地键入一个常量或变量作为NSArray对象并为其分配数组常量时,Swift将创建一个NSArray对象而不是Swift数组。
目前,解决方法是将其声明arrayColors为NSArray:
arrayColors
let arrayColors: NSArray = [cor1.CGColor, cor2.CGColor]
或声明为服用AnyObject:
let arrayColors: Array <AnyObject> = [cor1.CGColor, cor2.CGColor]