Generics Can';t在Swift中使用函数类型作为泛型类型约束

Generics Can';t在Swift中使用函数类型作为泛型类型约束,generics,swift,Generics,Swift,很可能我只是做错了。我正试图在Swift中创建一个合并函数,实际上是作为学习该语言的练习。我希望使它尽可能通用,因此我希望能够合并任何SequenceType。以下是关于重载的内容: func coalesce(S: SequenceType, T: @autoclosure () -> Any? where S.Generator.Element == T>(values: S) -> Any? { for value: () -> Any? in values

很可能我只是做错了。我正试图在Swift中创建一个
合并
函数,实际上是作为学习该语言的练习。我希望使它尽可能通用,因此我希望能够
合并
任何
SequenceType
。以下是关于重载的内容:

func coalesce(S: SequenceType, T: @autoclosure () -> Any? where S.Generator.Element == T>(values: S) -> Any? {
    for value: () -> Any? in values {
        if let found = value() {
            return found
        }
    }
    return nil
}

func coalesce(values: @autoclosure () -> Any?...) -> Any? {
    return coalesce(values)
}
编译器告诉我,
T
不能转换为
()->Any?
,而且它“需要一个类型名或协议组合来限制
T

现在,我明白了这意味着什么。编译器告诉我函数类型不能用作泛型类型约束。如果这是真的,那真是太可惜了。我真正喜欢Swift的一个地方是,当涉及到可空性时,它没有犯下分叉类型系统的错误。但是,当涉及到函数类型时,它看起来确实将类型系统分成了两部分。他们受到不同的待遇。这意味着围绕函数类型编写高度通用的代码即使不是不可能,也是非常困难的

我当然可以这样写,但这对我的口味来说还不够全面:

func coalesce(values: [@autoclosure () -> Any?]) -> Any?

有人知道如何使用
SequenceType
实现类似的功能吗?我正在考虑就此向苹果公司提交一个bug。

在这种情况下,
typealias
就可以了

typealias AutoclosuredOptionalAny = @autoclosure () -> Any?

func coalesce<S: SequenceType where S.Generator.Element == AutoclosuredOptionalAny>(values: S) -> Any? {
    for value: AutoclosuredOptionalAny in values {
        if let found = value() {
            return found
        }
    }
    return nil
}
typealias AutoclosuredOptionalAny=@autoclosure()->Any?
func coalesce(值:S)->有吗?{
对于值:值中的自动关闭选项任意{
如果let found=value(){
返回发现
}
}
归零
}

这是正确的。我曾尝试过这样做,但我的错误是使用了以下语法,因为我认为所有类型都必须使用别名:
coalesceany?其中S.Generator.Element==T>