如何在Swift中表达约束泛型函数的类型?

时间:2018-03-09 14:23:09

标签: swift

我可以定义一个函数

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

2 个答案:

答案 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

您可以将此视为“更深层次的原因”,我想要的泛型类型没有拼写:变量(与函数相对)在这个意义上根本不能是通用的。