Курс: Гид По Языку Программирования Swift - Тест 16


#1

Доброго дня! Необходимо сделать следующее два шага, но предполагаю, что делаю это не верно. Так как не могу справиться с задачей №2. Прошу помощи… Предварительно по заданию создано 2 класса и в них по несколько под-классов.

Создание класса выглядит так:

class Animal {

}

class Dog: Animal {

var color: String

var age: Int

var weight: Int

init (color: String, age: Int, weight: Int) {

self .color = color

self .age = age

self .weight = weight

}

}

Помещение в массив этого класса выглядит так:

var arrayOfAny = [ Animal ] ()

Наполнение массива так

arrayOfAny.append(Dog(color: “black”, age: 2, weight: 3))

Наполнение другого массива данными другого класса выглядит так

arrayOfDev.append(Mouse(company: “Apple”))

arrayOfDev.append(Keyboard(company: “Apple”))

arrayOfDev.append(Device(company: “Apple”))

  1. Задача: Создайте массив типа AnyObject и поместите в него члены двух массов путем перечисления (через циклы for)
    Пример моей реализации:

var arrayFinal: [AnyObject] = []

for _ in arrayOfDev {

arrayFinal.append(contentsOf: arrayOfDev)

}

for _ in arrayOfAny {

arrayFinal.append(contentsOf: arrayOfAny)

}

Здесь вроде все получилось без ошибок, далее легенда
arrayFinal - итоговый массив со всеми данными,
arrayOfDev - массив первого класса с его подклассами
arrayOfAny - массив второго класса с его другими подклассами

  1. Задача: И затем из этого массива c помощью проверки типов вытащите объекты только класса Dog.

А это совсем не получается.
Пробовал следующее:

for item in arrayFinal {
if item is Dog {
print(item)

}

Выводит это (не похоже на содержание класса, но количество выводов соответствует количеству параметров в объекте класса):
__lldb_expr_4.Dog
__lldb_expr_4.Dog
__lldb_expr_4.Dog


#2
var numbers = [1, 2, 3, 4, 5]
numbers.append(contentsOf: 10...15)
print(numbers)
// Prints "[1, 2, 3, 4, 5, 10, 11, 12, 13, 14, 15]"

Если я не совсем дурак, то у вас тут ошибка))
И вы в массив добавляете массив, и в итоге, у вас arrayFinal это [[Animal]]

нужно наверно

for  obj in arrayOfDev  {
    arrayFinal.append(obj)
}

#3

Спасибо. Действительно вкладывал массив в массив. Поправил. Далее из таким образом созданного массива надо извлечь класс (“И затем из этого массива c помощью проверки типов вытащите объекты только класса Dog.”) Делаю таким образом:

for item in arrayFinal {
    if item is Dog {
        print(item)
    }
}

В результате выходит ерунда.

Другие варианты (путем замены item в print(item) на arrayFinal, arrayFinal.* и пр) просто не работают =)

Подскажите, есть идеи, как “вытащить объекты только класса Dog” (например) из такого массива.


#4

можете закастить

попрубуйте arrayFinal.flatMap{ $0 as? Dog }


#5

получилось ли решить задание?


#6

Попробуйте так, заменив массивы на свои:

var bigArray: [AnyObject] = []

for obj in arrayOfAnimal {
bigArray.append(obj)
}

for obj in arrayOfDevice {
bigArray.append(obj)
}

for Dog in bigArray {
switch Dog {
case _ as Dog:
print(“This is dog”)
default:
print(“There is no dog”)
}
}