为什么没有分配相同的闭包类型

Why Same Closure type does not get assigned

class ParentClass<T>
{
    var success : ((T)->Void)?
}

extension ParentClass
{
   func success<T>(success: ((T) -> Void)?) -> ParentClass where T : Codable
   {
        self.success = success
        return self
    }
}

这里我只是试图将参数值分配给父 class 变量但是它抛出了这个错误 无法分配 '((T) -> Void)?' to type '((T) -> Void)?'

类型的值

另外,当我寻求建议提示时,它又一次给了我同样的错误。

因为您在 class(以及变量)定义中使用的 Generic 类型 NOT 与您在函数签名中定义的泛型。你应该确保两者相同:

class ParentClass<T> {    
    var success : ((T)->Void)?
}

extension ParentClass {
   func success(success: ((T) -> Void)?) -> ParentClass {
        self.success = success
        return self
    }
}

如果您希望它可编码:

class ParentClass<T: Codable> { ,,, }

或在扩展中:

extension ParentClass where T: Codable { ,,, }
func success<T>(success: ((T) -> Void)?) -> ParentClass where T : Codable

这里的<T>遮蔽了ParentClass中的T。这就像您有一个与 属性 同名的本地 var。只需将其移除,阴影就会消失:

extension ParentClass where T: Codable {
    func success(success: ((T) -> Void)?) -> ParentClass
}

请注意,这仅在 T 恰好是 Codable 时才添加此方法。这里没有要求 T 总是 Codable。如果你总是需要它,那么你应该定义 ParentClass<T: Codable> (并删除 where 子句)。

(感谢Mojtaba提醒我这里where必须继续扩展,而不是功能。)