比较 Swift 4 Xcode 9 中的 Int 数组切片元素时出错

Error comparing Int array slice elements in Swift 4 Xcode 9

在我 Xcode 9

的游乐场
func somefn<Int>(_ a:[Int])->[Int]{
    if(a.count == 1 || a.isEmpty){
        return a
    }else{
        let e1 = (a.count/2) - 1
        let s2 = e1 + 1

        let lhs = Array(a[...e1])
        let rhs = Array(a[s2...])

        if lhs.first! > rhs.first! {
            print("LHS first is bigger than RHS second")
        }

        return []
    }
}

let s = [1,4,6,9]
somefn(s)

给出错误:

Binary operator '>' cannot be applied to two 'Int' operands

问题似乎是函数名称后的 <Int> 语法被视为通用类型占位符,而不是 Int.

的实际数据类型

如果在整个函数声明中将 <Int> 替换为 T,您仍然会收到错误。

func somefn<T>(_ a:[T]) -> [T] {

这是有道理的,因为 < 运算符现在不明确。通过更新签名以指示 T 必须是 Comparable,问题就消失了:

func somefn<T:Comparable>(_ a:[T]) -> [T] {

你也可以这样做:

func somefn<Int:Comparable>(_ a:[Int]) -> [Int] {

但这会让任何 reader 感到困惑,因为 Int 不是 Int 的数据类型。

这一切都假定您打算能够传递不同数据类型的数组并取回相同类型的数组。

如果您只想为参数和 return 类型支持 Int 数组,请将签名更改为:

func somefn(_ a:[Int]) -> [Int] {