我有这个代码创建一个视图并应用渐变.
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数组.
目前,解决方法是要声明arrayColors
为NSArray
:
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)
归档时间: |
|
查看次数: |
19218 次 |
最近记录: |