为什么没有分配相同的闭包类型
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
必须继续扩展,而不是功能。)
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
必须继续扩展,而不是功能。)