2015-04-21 23 views
10

我在AppDelegate中,试图将回复传递给WatchKit扩展请求。我无法使用枚举数组作为其值被键入为AnyObject的字典中的值。在操场实验表明这一点:Swift [1,2]符合AnyObject,但[Enum.a,Enum.b]不是

enum E : Int { 
    case a = 0 
    case b 
} 
var x : AnyObject = [0, 1] // OK 
var y : AnyObject = [E.a, E.b] // [E] is not convertible to AnyObject 

当然,我可以通过转换我枚举到字符串或数字解决这一点,但为什么这是斯威夫特一个类型的错误?

回答

24

AnyObject为了与Objective-C兼容而存在。您只能将对象放入Objective-C可以解释的[AnyObject]数组中。 Swift枚举与Objective-C不兼容,所以你必须将它们转换成一些东西。

var x: AnyObject = [0, 1]的工作原理是因为Swift自动处理将Int转换为Objective-C可以处理的类型NSNumber。不幸的是,对于斯威夫特枚举没有这样的自动转换,这样你就留下来这样做:

var y: AnyObject = [E.a.rawValue, E.b.rawValue] 

这是假设你的枚举有一个基本类型的Objective-C可以处理,像StringInt

另一个不起作用的例子是可选的。

var a: Int? = 17 
var b: AnyObject = [a] // '[Int?]' is not convertible to 'AnyObject' 

请参阅Working with Cocoa Data Types了解更多信息。

+1

啊,你知道我把AnyObject和Any混淆了。哎呀! –

相关问题