关于swift中的通用咖喱语
我遇到了以下问题: 问题1-通用咖喱 创建一个名为关于swift中的通用咖喱语,swift,generics,functional-programming,currying,Swift,Generics,Functional Programming,Currying,我遇到了以下问题: 问题1-通用咖喱 创建一个名为Worker的协议,其中包含一个名为perform的函数,该函数接收函数并返回函数执行必须具有默认实现。 作为参数传递的函数应命名为work,并将符合协议的类型的实例作为参数,并返回泛型类型T。输出函数为()->T 我认为我必须返回作为参数传递给协议函数perform的work函数的执行 我想得对吗?如果我是,我怎么能这样做 我已经读过关于咖喱和泛型的书,但我仍然不明白这一点 编辑1: 我修复了关于默认实现的部分,但我仍然不知道如何返回该闭包 s
Worker
的协议,其中包含一个名为perform
的函数,该函数接收函数并返回函数<代码>执行必须具有默认实现。
作为参数传递的函数应命名为work
,并将符合协议的类型的实例作为参数,并返回泛型类型T。输出函数为()->T
我认为我必须返回作为参数传递给协议函数perform的work函数的执行
我想得对吗?如果我是,我怎么能这样做
我已经读过关于咖喱和泛型的书,但我仍然不明白这一点
编辑1:
我修复了关于默认实现的部分,但我仍然不知道如何返回该闭包
struct Person: Worker {
var name: String
var age: Int
}
protocol Worker {
func perform<A,T>(work: (A) -> (T)) -> () -> T
}
extension Worker {
func perform<A,T>(work: @escaping (A) -> T) -> () -> T {
return {}
}
}
编译器给了我以下错误:
Cannot convert return expression of type '() -> (A) -> T' to return type '() -> T'
我不明白为什么会这样,因为内部关闭
{x in work(x)}
在我看来,应该返回一个类型为T的值,因为它是函数work的执行,但是它返回一个(A)->T
我错过了什么
作为参数传递的函数应命名为work
,并将符合协议的类型的实例作为参数
Swift将“符合协议的类型”作为Self
提供。所以work
的参数应该是Self
,而不是A
。您根本不需要A
类型
protocol Worker {
func perform<T>(work: @escaping (Self) -> T) -> () -> T
}
首先,我建议你回到你的课本上,找到你家庭作业的答案。问题的关键是“默认实现”,您还需要考虑如何返回一个闭包。“DavidBerry,谢谢,我要检查一下!”DavidBerry我用我的发现对我的问题进行了编辑,但我无法理解返回结束的部分。我解释我的想法在问题编辑中的位置。
return {() in {x in work(x)}}
Cannot convert return expression of type '() -> (A) -> T' to return type '() -> T'
{x in work(x)}
protocol Worker {
func perform<T>(work: @escaping (Self) -> T) -> () -> T
}
extension Worker {
func perform<T>(work: @escaping (Self) -> T) -> () -> T {
return { work(self) }
}
}