无法将Expression <int>转换为Expression <anyobject>

时间:2017-11-15 15:07:17

标签: swift sqlite.swift

我正在使用SQLite.swift库。

我有几个Expression s,

let idColumn = Expression<Int>("id")
let nameColumn = Expression<String>("name")

我想要一本字典来托管他们,所以,我做了:

let columns: [String: Expression<AnyObject>] = [
   "id": idColumn,
   "name": nameColumn
]

但我收到了编译错误:

Cannot convert value of type 'Expression<Int>' to expected dictionary value type 'Expression<AnyObject>'

为什么会出现这个错误?为什么Int类型不能为AnyObject

我也尝试了Any而不是AnyObject

let columns: [String: Expression<Any>] = [
       "id" : idColumn,
       "name": nameColumn
    ]

类似的错误显示:

Cannot convert value of type 'Expression<Int>' to expected dictionary value type 'Expression<Any>'

我不明白......有人可以向我解释一下吗?

2 个答案:

答案 0 :(得分:3)

你的期望是错误的;你期望的不是Swift语言的工作原理。我将重复我在书中给出的例子:

  

专用于子类型的泛型类型对于专用于超类型的相同泛型类型不是多态的。例如,假设我们有一个简单的泛型结构以及一个类及其子类:

struct Wrapper<T> {
}
class Cat {
}
class CalicoCat : Cat {
}
  

然后你不能指定一个专门用于CalicoCat的Wrapper,其中需要一个专门用于Cat的Wrapper:

let w : Wrapper<Cat> = Wrapper<CalicoCat>() // compile error

从技术上讲,我们说泛型在参数化类型上不协变。该规则有例外 - 可选是显而易见的 - 但它们必须融入语言本身。

答案 1 :(得分:0)

裸露的IntString类型可以转换为AnyObject。但是当它们包含在泛型类型中时,这不适用:Expression<Int>无法转换为Expression<AnyObject>。这就是Swift今天如何运作的(Swift 4):

// OK
let i: Int = 1
let i2 = i as AnyObject

// Error: cannot convert value of type 'S<Int>' to type 'S<AnyObject>' in coercion
struct S<T> { }
let s = S<Int>()
let s2 = s as S<AnyObject>

此外,即使这样,您从字典中提取的表达式也会丢失其列类型:您无法在SQLite.swift中直接使用它们,例如您的other question