class Animal {
var name: String
var age: Int
init(name: String, age: Int) {
self.name = name
self.age = age
}
}
class Dog: Animal {
var breed: String
init(name: String, age: Int, breed: String) {
self.breed = breed
super.init(name: name, age: age)
}
func speak() -> String {
return "\(name) says woof!"
}
}
let animalList = [
Animal(name: “Lion”, age: 5),
Animal(name: “Tiger”, age: 3),
Dog(name: “Buddy”, age: 2, breed: “Labrador Retriever”),
Animal(name: “Elephant”, age: 10)
]
class Dog: Animal {
var breed: String
init(name: String, age: Int, breed: String) {
self.breed = breed
super.init(name: name, age: age)
}
func speak() -> String {
return "\(name) says woof!"
}
func speakAndReturnSelf() -> (Dog, String) -> () {
return { dog, sound in
print("\(dog.name) says \(sound)")
}
}
}
enum AnimalType {
case lion
case tiger
case dog
case elephant
}
func getAnimal(ofType type: AnimalType) -> Animal? {
switch type {
case .lion:
return animalList.first { $0.name == “Lion” }
case .tiger:
return animalList.first { $0.name == “Tiger” }
case .dog:
return animalList.first { $0 is Dog }
case .elephant:
return animalList.first { $0.name == “Elephant” }
}
}
let lion = getAnimal(ofType: .lion)
if let lion = lion {
print(lion.name) // Output: Lion
}
let dog = getAnimal(ofType: .dog) as? Dog
if let dog = dog {
let speakFunc = dog.speakAndReturnSelf()
speakFunc(dog, “woof”)
}