【问题标题】:Generic function -> Cannot convert return expression to return type泛型函数 -> 无法将返回表达式转换为返回类型
【发布时间】:2019-02-09 04:17:06
【问题描述】:

这是我在使用通用函数时遇到的一个小问题。由于缺乏泛型实践,可能是一个基本错误。无论如何,下面是与问题相关的代码。

泛型函数本身,没有显示任何错误:

func setThingRevision<GenericType:Revisionable>(entity name: String) -> [(GenericType,Int)] {
    var resultArray = [(GenericType,Int)]()
    // ..... we do some useful magic ......
    return resultArray
}

一些使用上述泛型函数的代码:

func setMyRealStuffRevision(entity name: String) -> [(RealType,Int)] {
    return setThingRevision(entity: name)
}

这是编译器在最后一个函数(setMyRealStuffRevision)中给出的错误信息:

Cannot convert return expression of type '[(_, Int)]' to return type '[(RealType, Int)]'

与其对消息感到惊讶,我想知道使用什么语法是正确的。

我的 RealTypeGenericType 兼容,但我不确定是否需要为 setThingRevision 泛型函数提供一些信息,或者是否可以从上下文中推断出来。

--- 加法---

这是我为测试目的而创建的假 setThingRevision

func setThingRevision<GenericType:Revisionable>(entity name: String) -> [(GenericType,Int)] {
    var resultArray = [(GenericType,Int)]()

    // Here name contains the name of a Core Data entity and getArrayFromEntity is
    // a local function, extracting an array from the contents of the entity.
    for item in getArrayFromEntity(name) as! [GenericType] {
        resultArray.append((item, 99))
        return resultArray
    }

    return resultArray
}

【问题讨论】:

  • 您能否编辑您的问题以提供一个证明错误的minimal reproducible example
  • 让我看看我能不能做点什么。我已经可以说的是 RealType 是 NSManagedObject 的子类。
  • 我不太明白发生了什么,因为对我来说(即使 RealType 是从 NSManagedObject 继承的)这段代码是可构建的。
  • @Paulw11。我编辑了帖子(见后---添加---)希望这个添加的代码能让你简单地测试。在我的情况下,我仍然得到与此测试代码相同的错误。
  • 它仍然不是minimal reproducible example - 因为它不完整。请尝试提供完整代码,而不是简单地粘贴到 Xcode 中会产生错误。例如revisionKanaArray 是什么?应该是resultArray

标签: ios swift generic-programming


【解决方案1】:

在类型安全的语言中,如果无法进行“诱导”转换,编译器会告诉您该消息。不知何故 'var resultArray = (GenericType,Int)' 它不会被解释为可以转换为返回函数类型的类型。仔细检查编译器分配的 resultArray 类型。正确使用的语法是不使用 'var' 来创建 resultArray 变量,而是显式定义类型。

【讨论】:

  • 我正在调查。现在,RealType 拥有 Revisionable 协议所需的所有字段,不多不少。但奇怪的是,我仍然遇到同样的错误。
  • 在旁边做一些测试,看看你是否可以将 realArray 类型转换为返回类型。我真的很怀疑,但你还是可以试试。
  • 你的意思是反过来(将类型返回给 realArray)?我正在尝试,但如果我想写类似“let x = setThingRevision(entity: "some-name")”的东西。我应该如何指定用于泛型类型的真实类型。我试过的没有用?
  • 我的意思是,不要直接返回 'setThingRevision(entity: name)' 的值,而是执行 'var dummy = setThingRevision(entity: name)' 并检查返回的类型假的。另外,尝试将 dummy 类型转换为与 setMyRealStuffRevision 函数相同类型的另一个变量“dummy2”,看看是否可以转换。
  • 好的。然后我需要知道如何做'var dummy = setThingRevision(entity:name)',因为它说它不能推断类型(这是预期的)我如何告诉setThingRevision在这种情况下使用什么泛型类型?
【解决方案2】:

试试这个

func setThingRevision<T: Revisionable>(entity name: String) -> [(T, Int)] {
    var resultArray = [(T, Int)]()
    // ..... we do some useful magic ......
    return resultArray
}

func setMyRealStuffRevision(entity name: String) -> [(RealType, Int)] {
    return setThingRevision(entity: name)
}

protocol Revisionable {
}

// edited
class RealType: NSManagedObject, Revisionable  {
}

【讨论】:

  • 除了把GenericType改成T还有什么意义? RealType 旁边是 NSManagedObject 的子类,而不是结构。
  • 我们使用 T 作为约定,T 作为模板。 GenericType 或 T 你的愿望。
猜你喜欢
  • 1970-01-01
  • 2022-12-13
  • 1970-01-01
  • 2018-07-31
  • 2021-01-18
  • 1970-01-01
  • 1970-01-01
  • 2023-03-12
  • 1970-01-01
相关资源
最近更新 更多