我正在使用SQLite.swift库。
我有几个Expression
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>'我不明白这个..。有人能给我解释一下吗?
发布于 2017-11-16 01:38:27
您的期望是错误的;您期望的不是Swift语言是如何工作的。我只会重复我在书中给出的例子:
专用子类型的泛型类型与专用于父类型的相同泛型类型不是多态的。例如,假设我们有一个简单的泛型结构以及一个类和它的子类:
struct Wrapper<T> {
}
class Cat {
}
class CalicoCat : Cat {
}那么你就不能给CalicoCat指定一个专用的包装器,而这个包装器应该是专用于
的:
let w : Wrapper<Cat> = Wrapper<CalicoCat>() // compile error从技术上讲,我们说泛型在其参数化类型上不是协变的。这条规则也有例外--显然是可选的--但它们必须融入到语言本身中。
发布于 2017-11-16 01:29:30
可以将裸Int和String类型转换为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所示。
https://stackoverflow.com/questions/47310797
复制相似问题