Swift中没有输入参数的通用函数?

7

我有一个通用的Swift函数,如下所示:

func toNSArray<T>() -> [T] {
...
}

编译器没有报错,但我不知道如何调用这个函数。我尝试了:
jList.toNSArray<String>()
jList.<String>toNSArray()

但是它没有起作用。

如何在Swift中调用一个没有输入参数的泛型函数?


2
与问题无关,但这个函数让我感到紧张,有两个原因 - 一是它被称为 toNSArray,但它返回的是一个 Swift 数组而不是 NSArray。另一个原因是,如果包含的类型不都是 T,它看起来可能会失败,但返回类型是非可选的(尽管它可能只用可以强制转换为 T 的值填充数组)。 - Airspeed Velocity
1个回答

14

你需要通过一些调用上下文告诉 Swift 返回类型应该是什么:

// either
let a: [Int] = jList.toNSArray()

// or, if you aren’t assigning to a variable
someCall( jList.toNSArray() as [Int] )

请注意,在后一种情况下,只有在someCall接受一个模糊类型,比如Any作为其参数时才需要这样做。如果相反,someCall被指定为接受[Int]作为参数,则函数本身提供了上下文,您可以直接编写someCall(jList.toNSArray())
事实上,有时候上下文可以推断得非常微弱!例如,以下代码是有效的:
extension Array {
    func asT<T>() -> [T] {
        var results: [T] = []
        for x in self {
            if let y = x as? T {
                results.append(y)
            }
        }
        return results
    }
}


let a: [Any] = [1,2,3, "heffalump"]

// here, it’s the 0, defaulting to Int, that tells asT what T is...
a.asT().reduce(0, combine: +)

请问你能解释一下你回答中的最后一行吗? - Michael
1
你指的是 reduce 吗? reduce 是一种将数组归约为单个值的函数。 在这里,它将一个整数数组和一个起始值为零,然后使用提供的函数(在本例中为 +)将它们逐个组合起来,得出数字 6。 由于 + 和 0 必须表示数字是整数,因此可以推断出 asT 返回的类型是整数。 - Airspeed Velocity

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接