首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法将Expression<Int>转换为Expression<AnyObject>

无法将Expression<Int>转换为Expression<AnyObject>
EN

Stack Overflow用户
提问于 2017-11-15 23:07:17
回答 2查看 261关注 0票数 0

我正在使用SQLite.swift库。

我有几个Expression

代码语言:javascript
复制
let idColumn = Expression<Int>("id")
let nameColumn = Expression<String>("name")

我希望有一个字典来存放它们,所以,我做到了:

代码语言:javascript
复制
let columns: [String: Expression<AnyObject>] = [
   "id": idColumn,
   "name": nameColumn
]

但是我得到了编译器错误:

代码语言:javascript
复制
Cannot convert value of type 'Expression<Int>' to expected dictionary value type 'Expression<AnyObject>'

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

我也尝试了Any而不是AnyObject

代码语言:javascript
复制
let columns: [String: Expression<Any>] = [
       "id" : idColumn,
       "name": nameColumn
    ]

类似的错误显示:

代码语言:javascript
复制
Cannot convert value of type 'Expression<Int>' to expected dictionary value type 'Expression<Any>'

我不明白这个..。有人能给我解释一下吗?

EN

回答 2

Stack Overflow用户

发布于 2017-11-16 01:38:27

您的期望是错误的;您期望的不是Swift语言是如何工作的。我只会重复我在书中给出的例子:

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

代码语言:javascript
复制
struct Wrapper<T> {
}
class Cat {
}
class CalicoCat : Cat {
}

那么你就不能给CalicoCat指定一个专用的包装器,而这个包装器应该是专用于

的:

代码语言:javascript
复制
let w : Wrapper<Cat> = Wrapper<CalicoCat>() // compile error

从技术上讲,我们说泛型在其参数化类型上不是协变的。这条规则也有例外--显然是可选的--但它们必须融入到语言本身中。

票数 3
EN

Stack Overflow用户

发布于 2017-11-16 01:29:30

可以将裸IntString类型转换为AnyObject。但是当它们被包装在泛型类型中时,这就不适用了:不能将Expression<Int>转换为Expression<AnyObject>。这就是Swift今天的工作方式(Swift 4):

代码语言:javascript
复制
// 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所示。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47310797

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档