【问题标题】:Swift 4 - Generic Type Conversion issue - Cannot convert to expected type '(_) -> Void'Swift 4 - 泛型类型转换问题 - 无法转换为预期类型 '(_) -> Void'
【发布时间】:2018-08-16 15:53:14
【问题描述】:

我使用的是 Xcode 9.2。

我收到错误消息:

无法将“(ValueType2) -> Void”类型的值转换为预期值 参数类型 '(_) -> Void'

我有以下代码:

import UIKit

enum Value<ValueType> {

    case hasValue(ValueType)

}

class BaseClass<ValueType> {

    var value: Value<ValueType>?

    func f1<ValueType2>(closure: @escaping (ValueType, @escaping (ValueType2) -> Void) -> Void ){

        let s1 = SubClass<ValueType2>()

        // The point of the generic type conversion issue
        // Cannot convert value of type '(ValueType2) -> Void' to expected argument type '(_) -> Void'

        closure(value!, s1.f2)

    }

}

class SubClass<ValueType>: BaseClass<ValueType> {

    func f2(value: ValueType) -> Void { /* DO SOMETHING */ }

}

我不确定这是否与 Swift 4.1 中修复的 Swift 错误有关:

Swift Generics: Cannot convert value of type to expected argument type

因为自动完成知道类的正确泛型类型参数和函数的参数 - ValueType2 - 在这两种情况下。

关于如何克服这个错误的任何想法?

谢谢

【问题讨论】:

  • 看起来它可能是该错误的一个实例。如果我用Int 之类的具体类型替换ValueType2 的所有实例,错误就会消失。
  • 跟我想的一样。
  • 我还注意到,如果我从 f1(closure:) 方法中删除 ValueType 泛型参数,编译器问题就会消失。似乎编译器不喜欢闭包中的两个泛型类型。

标签: ios swift generics type-conversion swift4


【解决方案1】:

在您的f2 中,closure 的类型是@escaping (ValueType, @escaping (ValueType2) -&gt; Void) -&gt; Void

第一个参数的类型是ValueType。 但是您将其用作:

closure(value!, s1.f2)

第一个参数value!的类型是Value&lt;ValueType&gt;,而不是ValueType


如果您将closure 的类型更改为@escaping (Value&lt;ValueType&gt;, @escaping (ValueType2) -&gt; Void) -&gt; Void,您的代码将毫无问题地编译。

您可能发现了一些关于泛型的问题,但至少,您的代码示例没有描述该问题。

【讨论】:

  • 完美。多年来,我一直在盯着答案。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多