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

Spa*_*Dog 34 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)
Run Code Online (Sandbox Code Playgroud)

Xcode没有给我编译错误,但代码崩溃了

let arrayColors = [cor1.CGColor, cor2.CGColor]
Run Code Online (Sandbox Code Playgroud)

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

事实上我期待它在那里崩溃,因为我不知道如何在Swift上创建一个CGColors数组.令人惊讶的是Xcode提到了Objective-C.在我看来,我正在迅速创建一个CGColorRef ...

有线索吗?为什么提到Objective-C,我该如何解决?

Ber*_*ter 29

提到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]


And*_*ing 19

如果尝试将类型数组桥[MySwiftProtocol]接到Objective-C,也可以触发此运行时错误.

解决方案是标记您的协议@objc:

@objc protocol MySwiftProtocol {
   // ...
}
Run Code Online (Sandbox Code Playgroud)

  • 我扩展了一个Objective-C类以符合Swift协议,并且在执行此操作之前无法将该类类型的数组桥接到协议类型.我遇到的错误略有不同:"致命错误:无法从Objective-C桥接数组". (2认同)