我正在使用 Swift 3 和 constrained generics (即 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
}
Swift 似乎不知道那是什么意思。关于如何解决此问题的任何想法?如果可能的话,我不想将它们全部转换为 DomainResource
对象。
最佳答案
你写了这个函数签名:
func jsonToObj<T:DomainResource>(jsonStr: String) -> [T:DomainResource]
这表示 jsonToObj(jsonStr:)
方法返回一个字典,其键为 T
类型,其值为 DomainResource
类型.看起来您只想编写此函数签名:
func jsonToObj<T:DomainResource>(jsonStr: String) -> [T]
关于快速转换为具有约束的通用类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44139423/