一尘不染

Swift [1,2]符合AnyObject,但[Enum.a,Enum.b]不符合

swift

我在AppDelegate中,尝试传递对WatchKit扩展请求的答复。我不能使用枚举数组作为其值键入为AnyObject的Dictionary中的值。在操场上进行实验显示:

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

当然,可以通过将枚举转换为字符串或数字来解决此问题,但是为什么这在Swift中是类型错误?


阅读 194

收藏
2020-07-07

共1个答案

一尘不染

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

var x: AnyObject = [0, 1]之所以起作用,是因为Swift会自动处理Object-
C可以处理Int的类型转换NSNumber。不幸的是,Swift枚举没有这种自动转换,因此您需要做以下事情:

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'

有关更多信息,请参见使用可可数据类型

2020-07-07