一尘不染

数组元素无法桥接到Objective-C

swift

我有这段代码可创建视图并对其应用渐变。

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,我该如何解决?


阅读 225

收藏
2020-07-07

共1个答案

一尘不染

之所以提到Objective-C是因为UIKit和QuartzCore是Objective-C框架。特别是,gradient.colors = arrayColors正在调用需要一个的Objective-C方法NSArray

这似乎是一个错误,因为Apple的文档表明,NSArray只要可以考虑数组中的项目,数组就应该自动桥接到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数组。

目前,解决方法是将其声明arrayColorsNSArray

let arrayColors: NSArray = [cor1.CGColor, cor2.CGColor]

或声明为服用AnyObject

let arrayColors: Array <AnyObject> = [cor1.CGColor, cor2.CGColor]

2020-07-07