【问题标题】:Swift Cast to Generic Type with Constraint带约束的 Swift 转换为泛型类型
【发布时间】: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


【解决方案1】:

你写了这个函数签名:

func jsonToObj<T:DomainResource>(jsonStr: String) -> [T:DomainResource]

这表示jsonToObj(jsonStr:) 方法返回一个字典,其键的类型为T,其值的类型为DomainResource。看起来你只想写这个函数签名:

func jsonToObj<T:DomainResource>(jsonStr: String) -> [T]

【讨论】:

  • 就是这样。谢谢。
猜你喜欢
  • 1970-01-01
  • 2018-09-27
  • 1970-01-01
  • 2013-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多