Ios Swift 4-泛型类型转换问题-无法转换为预期类型';(u)->;无效';

Ios Swift 4-泛型类型转换问题-无法转换为预期类型';(u)->;无效';,ios,swift,generics,type-conversion,swift4,Ios,Swift,Generics,Type Conversion,Swift4,我使用的是Xcode 9.2 我收到错误信息: 无法将类型为“(ValueType2)->Void”的值转换为预期值 参数类型“(?)->Void” 我有以下代码: import UIKit enum Value<ValueType> { case hasValue(ValueType) } class BaseClass<ValueType> { var value: Value<ValueType>? func f1&l

我使用的是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 */ }

}
导入UIKit
枚举值{
case hasValue(ValueType)
}
类基类{
var值:值?
func f1(闭包:@escaping(ValueType,@escaping(ValueType2)->Void)->Void){
设s1=子类()
//泛型类型转换问题的要点
//无法将类型为“(ValueType2)->Void”的值转换为预期的参数类型“(\ux)->Void”
闭包(值!,s1.f2)
}
}
类子类:基类{
func f2(value:ValueType)->Void{/*做点什么*/}
}
我不确定这是否与Swift 4.1中修复的Swift错误有关:

因为autocomplete知道在这两种情况下类的正确泛型类型参数和函数的参数-
ValueType2

关于如何克服这个错误有什么想法吗


谢谢

在您的
f2
中,
闭包的类型是
@escaping(ValueType,@escaping(ValueType2)->Void)->Void

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

closure(value!, s1.f2)
第一个参数
值的类型
,而不是
值类型


如果将
闭包
的类型更改为
@escaping(Value,@escaping(ValueType2)->Void)->Void
,则代码编译时不会出现任何问题


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

f2
中,
闭包的类型是
@escaping(ValueType,@escaping(ValueType2)->Void

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

closure(value!, s1.f2)
第一个参数
值的类型
,而不是
值类型


如果将
闭包
的类型更改为
@escaping(Value,@escaping(ValueType2)->Void)->Void
,则代码编译时不会出现任何问题


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

看起来它可能是该错误的一个实例。如果我将
ValueType2
的所有实例替换为
Int
这样的具体类型,错误就会消失。正如我所想。我还注意到,如果我从f1(closure:)方法中删除ValueType泛型参数,编译器问题就会消失。编译器似乎不喜欢闭包中的两个泛型类型。看起来它可能是该bug的一个实例。如果我将
ValueType2
的所有实例替换为
Int
这样的具体类型,错误就会消失。正如我所想。我还注意到,如果我从f1(closure:)方法中删除ValueType泛型参数,编译器问题就会消失。编译器似乎不喜欢closure.Perfect中的两个泛型类型。我已经盯着答案看了很久了。非常感谢。完美的我已经盯着答案看了很久了。非常感谢。