Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 试图存储CGColor类型元素时,作为实例变量的数组崩溃(Xcode 6 beta 4)_Swift - Fatal编程技术网

Swift 试图存储CGColor类型元素时,作为实例变量的数组崩溃(Xcode 6 beta 4)

Swift 试图存储CGColor类型元素时,作为实例变量的数组崩溃(Xcode 6 beta 4),swift,Swift,buildPalette()的最后一行与EXC\u BAD\u指令(code=EXC\u I386\u IVOP,子代码=0x0)崩溃。如果我使用不同的类型,比如Int,而不是CGColor,就可以了 奇怪的是,我可以为数组使用一个局部变量并用颜色填充它,但是当我试图从buildPalette()返回它时,它会崩溃并显示相同的消息 编辑:正如Maciej Trybiło 1所评论的,该问题已在Xcode Beta 5中修复 您正在数组中使用CGColor,因此无法正确转换(桥接到目标c)在swi

buildPalette()
的最后一行与EXC\u BAD\u指令(code=EXC\u I386\u IVOP,子代码=0x0)崩溃。如果我使用不同的类型,比如
Int
,而不是
CGColor
,就可以了

奇怪的是,我可以为数组使用一个局部变量并用颜色填充它,但是当我试图从
buildPalette()
返回它时,它会崩溃并显示相同的消息


编辑:正如
Maciej Trybiło 1
所评论的,该问题已在
Xcode Beta 5中修复

您正在数组中使用
CGColor
,因此无法正确转换(桥接到
目标c
)在swift
AnyObject
数组中。当您在数组中使用
CGColor
时,它在数组中不能直接转换为
AnyObject
,因此在使用objective c类时会导致运行时错误。您需要将
var调色板
定义为
[AnyObject]
CoreGraphics
swift
之间正确转换,或者您可以使用
UIColor

来自斯威夫特

从Swift数组桥接到NSArray对象时 Swift数组中的元素必须与任何对象兼容。例如 Int[]类型的Swift数组包含Int结构元素。整数 类型不是类的实例,但因为Int类型桥接 对于NSNumber类,Int类型与AnyObject兼容。 因此,可以将Int[]类型的Swift数组桥接到NSArray 反对如果Swift数组中的元素与任何对象都不兼容,则 桥接到NSArray对象时发生运行时错误。

您还可以直接从Swift数组文本创建NSArray对象,遵循上述相同的桥接规则。当你 显式键入常量或变量作为NSArray对象并赋值 如果是数组文字,Swift将创建一个NSArray对象,而不是 敏捷阵型

因此,您需要使
CGColor
AnyObject
兼容。因此下面的代码可以正常工作

@objc class Palette {
    var palette: [AnyObject]

    init() {
        palette = [AnyObject]()
        buildPalette()
    }

    func buildPalette() {

        let rgb = CGColorSpaceCreateDeviceRGB()

        // omitting the loop for simplicity
        let color:CGColorRef = CGColorCreate(rgb, [1.0, 1.0, 1.0, 1.0])
        palette.append(color)   // crashes here
    }
}

上述方法适用于
CGColor
,但您可以使用
UIColor
而不是
CGColor
,并且可以通过
UIColor(CGColor:CGColor?
)转换
CGColor

“您在数组中使用CGColor,因此无法在swift AnyObject中正确转换。”我不明白你这是什么意思
CGColor
在我看来似乎与
AnyObject
兼容。@newacct如果我们声明palete[CGColor]并向其添加CGColor,则swift无法将此数组转换为palete[AnyObject]因为CGColor是隐式的。所以我们需要将它声明为显式进行转换的AnyObject。从文档:
如果Swift数组中的元素与AnyObject不兼容,当您桥接到NSArray对象时,会发生运行时错误。
我觉得这似乎是一个错误,好像您将CGColor分配给任何对象一样。它工作正常,但将CGColor数组转换为任何对象数组将导致运行时错误,因为它无法正确转换数组。谢谢,codester,AnyObject工作了,但现在beta 5修复了它,CGColor也工作了!
@objc class Palette {
    var palette: [AnyObject]

    init() {
        palette = [AnyObject]()
        buildPalette()
    }

    func buildPalette() {

        let rgb = CGColorSpaceCreateDeviceRGB()

        // omitting the loop for simplicity
        let color:CGColorRef = CGColorCreate(rgb, [1.0, 1.0, 1.0, 1.0])
        palette.append(color)   // crashes here
    }
}