我可以定义一个函数
func myGenericFunc<A: SomeProtocol>(_ a: A) -> A { ... }
现在我想输入一个变量来保存这种功能,但我发现我不能拼写这种类型:
let f: (SomeProtocol) -> SomeProtocol // doesn't express the genericity
let f: <A: SomeProtocol>(A) -> A // non-existent syntax
有什么方法可以直接表达这个吗?
请注意,我特别希望f
仍然是通用:它应该接受任何SomeProtocol
conformer(因此不提前修复泛型类型参数)。换句话说:我可以使用myGenericFunc
做任何事情我也希望能够使用f
。
答案 0 :(得分:1)
快速回答是否,您无法使用单个变量来保存不同的功能实现。变量需要保存一些具体的东西,以便编译器分配适当的内存布局,并且它不能使用泛型构造。
如果需要保存不同的闭包引用,可以使用泛型类别别名:
for product in resposne.css(".view-advanced-catalog tr > td"):
item = {}
item['name'] = product.css(".views-field-title").extract_first()
item['old_price'] = product.css(".views-field-phpcode span span::text").extract()[0]
item['new_price'] = product.css(".views-field-phpcode span span::text").extract()[1]
yield item
答案 1 :(得分:0)
我最初的问题是关于直接表达类型,但同样有趣的是注意到由于不同的原因这是不可能的:
func myGenericFunc<A: SomeProtocol>(_ a: A) -> A { ... }
let f = myGenericFunc // error: generic parameter 'A' could not be inferred
您可以将此视为“更深层次的原因”,我想要的泛型类型没有拼写:变量(与函数相对)在这个意义上根本不能是通用的。