【问题标题】:Swift Generics: Constraining Argument TypesSwift 泛型:约束参数类型
【发布时间】:2016-04-25 18:55:00
【问题描述】:

来自 C++ 背景(模板),我很难理解为什么以下 Swift 代码(泛型)无法编译:

func backwards<T>(array: [T]) -> [T] {
    let reversedCollection = array.sort(>)

    return reversedCollection
}

我的理解是 T 是一个泛型类型,我没有对其施加任何约束 (&lt;T&gt;) 并将 array 声明为 Array&lt;T&gt; 类型。然而,这会产生以下错误:

对成员'sort()'的模糊引用

我了解可以使用协议对泛型类型施加约束。但是,在这种情况下,我不希望对 T 有任何限制。相反,我想限制第一个参数的类型。

我已经阅读 Apple 的关于通用类型的文档几个小时了,但我仍然不太聪明。我的印象是这是不可能的,并且仅对声明的类型施加了约束,但就我所知。

所以问题是:如果可能,我如何对函数参数的类型施加约束?如果不是,我如何获得相同的结果?

【问题讨论】:

    标签: swift generics


    【解决方案1】:

    sort(&gt;) 仅当 ElementComparable 时才合法。由于[T] 的元素类型是TT 必须符合Comparable 才能使数组[T] 可以通过&gt; 排序:

    func backwards<T: Comparable>(array: [T]) -> [T] {
        let reversedCollection = array.sort(>)
    
        return reversedCollection
    }
    

    【讨论】:

    • 谢谢,这确实有效。不幸的是,我没有从编译器消息中推断出这一点。我本来预计会出现一些涉及 T 和比较运算符的错误消息。为了将来的调试参考,你能再澄清一下吗?
    • @OnMyLittleDuck 实际上,这对编译器来说是很糟糕的错误。我建议您在bugs.swift.org 提交错误报告。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多