ios - 错误 : generic parameter 'T' could not be inferred in swift

标签 ios arrays swift algorithm generics

我有一个函数,可以从嵌套数组中生成扁平数组。它非常适合 int 数组。

let array: [Any] = [1, 2, [3]]

func makeFlatArray(_ array: [Any]) -> [Int] {
    var flatArray = [Int]()
    for item in array {
        if let item = item as? Int {
            flatArray.append(item)
        } else if let item = item as? [Any] {
            let result = makeFlatArray(item)
            flatArray += result
        }
    }
    return flatArray
}

但我想让它成为通用的,但我在尝试时遇到了错误。

func makeFlatArrayGeneric<T>(_ array: [Any]) -> [T] {
    var flatArray = [T]()
    for item in array {
        if let item = item as? T {
            flatArray.append(item)
        } else if let item = item as? [Any] {
            let result = makeFlatArrayGeneric(item)
            flatArray += result
        }
    }
    return flatArray
}

错误:

Playground execution failed:

error: FlatNestedArraysExample.playground:22:26: error: generic parameter 'T' could not be inferred
            let result = makeFlatArrayGeneric(item)
                         ^

FlatNestedArraysExample.playground:16:6: note: in call to function 'makeFlatArrayGeneric'
func makeFlatArrayGeneric<T>(_ array: [Any]) -> [T] {

最佳答案

你必须告诉编译器 T 的类型。

func makeFlatArrayGeneric<T>(_ array: [Any]) -> [T] {
    var flatArray = [T]()
    for item in array {
        if let item = item as? T {
            flatArray.append(item)
        } else if let item = item as? [Any] {
            let result: [T] = makeFlatArrayGeneric(item)
            flatArray += result
        }
    }
    return flatArray
}

let array: [Any] = [1, 2, [3], [4, [5]]]
let items: [Int] = makeFlatArrayGeneric(array) //[1, 2, 3, 4, 5]

一种更实用的方法来解决您的问题。

extension Array {
    func flatten() -> Array<Element> {
        return self.flatMap({ element -> [Element] in
            if let array = element as? Array {
                return array.flatten()
            } else {
                return [element]
            }
        })
    }
}

let items: [Int] = array.flatten() //[1, 2, 3, 4, 5]

关于ios - 错误 : generic parameter 'T' could not be inferred in swift,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46832056/

相关文章:

android - Google Analytics 在几分钟后失去跟踪

ios - Xcode 9.4 : Error generating code coverage

c++ - 给定数字列表有多少种方法可以得到 21?如何获得所有可能的数字组合?

swift - 使用 applescript 将我的应用程序添加到登录项,但遇到奇怪的权利权限问题

iphone - 如何使用注释降低 MKMapview 的缩放级别?

ios - 如何缩放 UIButton 的 imageView?

php - 比较多维数组并返回数组中缺少的键

arrays - 将二进制 BIT 转换为数组的索引号 - Swift

ios - 如何解决来自 Firebase 的 Apple Mach-O 链接器错误?

ios - swift - UIView 阴影渲染不正确