Ios Swift 4-泛型类型转换问题-无法转换为预期类型';(u)->;无效';
我使用的是Xcode 9.2 我收到错误信息: 无法将类型为“(ValueType2)->Void”的值转换为预期值 参数类型“(?)->Void” 我有以下代码: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
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中的两个泛型类型。我已经盯着答案看了很久了。非常感谢。完美的我已经盯着答案看了很久了。非常感谢。