【问题标题】:(Swift 3)generic parameter T could not be inferred(Swift 3)无法推断通用参数 T
【发布时间】:2017-09-17 15:00:32
【问题描述】:

我正在尝试创建一个函数,它接收嵌套的对象数组,例如 [1,[2,[3,4],[5,6]]],并在单个数组中返回值,例如 [1,2, 3,4,5,6]。我想为通用对象做这件事,所以我创建了一个方法

func getNestedArray<T>(array:[Any])->[T]?{

    var nestedArray:[T] = []
    for object in array{

        if object is [Any]{
        let neededArray = getNestedArray(array: object as! [Any])
        nestedArray.append(contentsOf: neededArray)
        }
        else if object is T{
            nestedArray.append(object as! T)
        }
        else{
         print("send proper array dumbass")
            return nil
        }
    }
    return nestedArray
}

因此,如果对象是 T 类型,我只需附加它,或者如果它是数组类型,我将再次调用该函数并递归地给我正确的结果,但在调用此函数时出现错误。我究竟做错了什么?我只是将 'Any' 类型的对象作为 '[Any]' 传递。为什么会抛出这个错误?

【问题讨论】:

  • 为什么这被否决了?我问错了吗?

标签: generics swift3


【解决方案1】:

你没有告诉编译器neededArray 应该是什么类型。编译器抱怨是很自然的。从上下文来看,我认为您希望neededArray 成为T 的数组。所以明确地说出类型:

let neededArray: [T] = getNestedArray(array: object as! [Any])

显然这不起作用,因为您还没有打开可选项。好吧,如果getNestedArray 返回 nil,这意味着数组首先是无效的,我们可能也应该返回 nil:

guard let neededArray: [T] = getNestedArray(array: object as! [Any]) else { return nil }

记得在使用方法时也要指定类型!

let result: [Int] = getNestedArray(array: [1, [2, [3, [4]]]])!

【讨论】:

  • 感谢您的回复。有效。对不起,我第一次尝试泛型,我无法理解那个错误
猜你喜欢
  • 1970-01-01
  • 2021-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-19
  • 1970-01-01
  • 2015-09-22
  • 2018-03-31
相关资源
最近更新 更多