【发布时间】:2017-05-23 15:42:44
【问题描述】:
我正在使用带有constrained generics 的Swift 3(即where 子句)。当我尝试进行泛型类型转换时遇到问题。这是问题的简化示例:
func jsonToObj<T:DomainResource>(jsonStr: String) -> [T:DomainResource] {
let json = JSON(parseJSON: jsonStr).dictionaryObject
let bundle = SMART.Bundle(json: json)
let result = bundle.entry?.map() {
return $0.resource as! T
}
return result!
}
我的问题是当我从该方法返回时,编译器抱怨它无法将类型[T] 转换为类型[T:DomainResource]。如果我从泛型中删除 DomainResource 约束,它会编译并运行得很好。
这不是我想要的,所以,我尝试了这个:
let result = bundle.entry?.map() {
return $0.resource as! T:DomainResource
}
斯威夫特似乎不知道这意味着什么。关于如何解决这个问题的任何想法?如果可能的话,我不希望将它们全部转换为 DomainResource 对象。
【问题讨论】:
-
你是什么意思删除约束不是你想要的?
[T:DomainResource]不是T的数组,限制为DomainResource- 它是一个字典。你只想要[T]。占位符T在占位符声明中仍被限制为DomainResource。尽管在map(_:)中强制转换为T看起来仍然有点不确定——你确定它永远不会失败(对于T的任何具体类型)? -
这个
[T: DomainResource]是错误的返回类型。您返回的是字典,而不仅仅是T。 -
对,我正在返回一本字典。这就说得通了。另外,是的,我们正在根据标准映射我们的数据,这就是
as!始终有效的原因。
标签: swift generics types casting