Фильтрация переменных типа Any - PullRequest
1 голос
/ 26 мая 2020

У меня есть следующий класс и конструктор:

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, а также не по порядку, есть идеи, как я могу этого достичь?

1 Ответ

1 голос
/ 26 мая 2020

Прежде всего, порядок обработки varargs не кажется последовательным, а скорее похож на рекурсивный вызов init(_ items: Any...), поэтому я не думаю, что вы можете получить желаемый порядок.

Что касается печати, то примитив main.list происходит из вызова

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

, где T равно Any и 3, а каждый объект List является экземпляром T. Это станет намного яснее, если вы добавите печать в качестве первой строки 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")
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...