首页 > 解决方案 > 过滤任何类型的可变参数

问题描述

我有以下类和构造函数:

class List<T> {
    var value: T
    var next: List<T>?

init(_ items: Any...) {

}

构造函数可以接受以下内容: let list = List<Any>(List<Int>(7, 2), 6, List<Any>(3, List<Int>(5, 1)))

我在构造函数中的目标是按特定顺序过滤掉数字 7,2,6,3,5,1,当然它们可以是字符串,因为它是一个模板。我试过的是

    init(_ items: Any...) {
        for info in items 
        {

           if let str = info as? T {
             if let str2 = info as? List<T> {

             }
             else
             {
                     print("this is primitive \(info)")
             }


           }
        } 

但是结果我得到:

this is primitive 7
this is primitive 2
this is primitive 5
this is primitive 1
this is primitive 3
this is primitive main.List<Swift.Int>
this is primitive main.List<Swift.Int>
this is primitive 6

所以我似乎没有过滤掉 main.List 也没有按顺序过滤,有什么想法可以实现吗?

标签: swift

解决方案


首先,处理可变参数的顺序似乎不是顺序的,而是像递归调用一样,init(_ items: Any...)所以我认为你不能得到你想要的顺序。

关于 main.list 是原语的打印来自调用

init(3, List<Int>(5, 1)

其中 T 是 Any 和 3,List 对象都是 T 的一个实例。如果您将 print 添加为init

print(items)

下面是我的init测试版本

init(_ items: Any...) {
    print(items)
    for item in items {
        switch item {
        case is List<T>:
            print("Is list")
        case is T:
            print("Primitive \(item)")
        default:
            print("Other stuff")
        }
    }
}

推荐阅读