Как отсортировать массив с двумя разными классами?

swift
xcode
ios

#1

Привет, вот задание -
Используя нужный метод array отсортировать массив (как результат будет другой массив).
Нижу мой код, каким способом можно отсортировать?
class People {

var name : String

var height : Int

var weight : Int

var gender : String

init (name:String,height:Int,weight:Int,gender:String) {

self .name = name

self .height = height

self .weight = weight

self .gender = gender

}

func say() -> String {

return “Hello”

}

}

class Manager : People {

var working : String

init (name: String, height: Int, weight: Int, gender: String,working:String) {

self .working = working

super . init (name: name, height: height, weight: weight, gender: gender)

}

override func say() -> String {

return super .say() + " " + “(working)”

}

}

var manager = Manager(name: “Lasly”, height: 188, weight: 85, gender: “M”, working: “manager”)

class Cook : People {

var hobby : String

init (name: String, height: Int, weight: Int, gender: String,hobby: String) {

self .hobby = hobby

super . init (name: name, height: height, weight: weight, gender: gender)

}

override func say() -> String {

return super .say() + ", " + “my hobby:(hobby)”

}

}

var cook = Cook(name: “Max”, height: 177, weight: 77, gender: “M”, hobby: “Football”)

class Figther : People {

var numberOfFights : Int

init (name: String, height: Int, weight: Int, gender: String,numberOfFights:Int) {

self .numberOfFights = numberOfFights

super . init (name: name, height: height, weight: weight, gender: gender)

}

override func say() -> String {

return super .say() + “,” + " my number of fights:(numberOfFights)"

}

}

class Medic : People {

var car : String

var age : Int

init (name: String, height: Int, weight: Int, gender: String,car:String,age:Int) {

self .car = car

self .age = age

super . init (name: name, height: height, weight: weight, gender: gender)

}

override func say() -> String {

return super .say() + ", " + “i’m medic.”

}

}

var medic = Medic(name: “Petr”, height: 169, weight: 68, gender: “M”, car: “AUDI”, age: 29)
class Marcianin {

var colorHide : String

var height : Int

var weight : Int

func nloSay() -> String {

return “I am marcianin”

}

init (colorHide:String,height:Int,weight:Int) {

self .colorHide = colorHide

self .height = height

self .weight = weight

}

}

class Reptilion : Marcianin {

override func nloSay() -> String {

return super .nloSay() + ", " + “my color hide (colorHide)”

}

}

class Nord : Marcianin {

override func nloSay() -> String {

super .nloSay() + ", " + “my height (height)”

}

}

var nord = Nord(colorHide: “Black”, height: 359, weight: 190)

var reptilion = Reptilion(colorHide: “Red”, height: 499, weight: 340)

var people = [medic,cook,fighter,manager]

var marcianin = [nord,reptilion]

var marsiAndPeople = [people as AnyObject ,marcianin as AnyObject]


#2

А какое условие для сортировки то?
И у вас массив получился такой [[AnyObject], [AnyObject]]


#3

Сортировать так: сначала People, а потом Марсиане, люди отсортированы по имени, а Марсиане по марсианским цвету волос. )
насчет массива, как лучше сделать?


#4

Для удобного чтения

class People {
    var name : String
    var height : Int
    var weight : Int
    var gender : String

    init (name: String, height: Int, weight: Int, gender: String) {
        self.name = name
        self.height = height
        self.weight = weight
        self.gender = gender
    }

    func say() -> String {
        return “Hello”
    }

}

class Manager : People {
    var working : String

    init(name: String, height: Int, weight: Int, gender: String, working: String) {
        self.working = working
        super.init (name: name, height: height, weight: weight, gender: gender)
    }

    override func say() -> String {
        return super.say() + " " + “(working)”
    }
}

var manager = Manager(name: “Lasly”, height: 188, weight: 85, gender: “M”, working: “manager”)

class Cook : People {

    var hobby : String

    init(name: String, height: Int, weight: Int, gender: String, hobby: String) {
        self.hobby = hobby    
        super.init (name: name, height: height, weight: weight, gender: gender)
    }

    override func say() -> String {
        return super.say() + ", " + “my hobby:(hobby)”    
    }

}

var cook = Cook(name: “Max”, height: 177, weight: 77, gender: “M”, hobby: “Football”)

class Figther : People {

    var numberOfFights : Int

    init(name: String, height: Int, weight: Int, gender: String, numberOfFights: Int) {
        self.numberOfFights = numberOfFights
        super.init(name: name, height: height, weight: weight, gender: gender)
}

    override func say() -> String {
        return super.say() + “,” + " my number of fights:(numberOfFights)"
    }
    
}

class Medic: People {

    var car : String
    var age : Int

    init(name: String, height: Int, weight: Int, gender: String, car: String, age: Int) {
        self.car = car
        self.age = age
        super.init(name: name, height: height, weight: weight, gender: gender)
    }

    override func say() -> String {
        return super.say() + ", " + “i’m medic.”
    }
}

var medic = Medic(name: “Petr”, height: 169, weight: 68, gender: “M”, car: “AUDI”, age: 29)
class Marcianin {

    var colorHide : String
    var height : Int
    var weight : Int

    func nloSay() -> String {
        return “I am marcianin”
    }

    init(colorHide: String, height: Int, weight: Int) {
        self.colorHide = colorHide
        self.height = height
        self.weight = weight
    }

}

class Reptilion : Marcianin {

    override func nloSay() -> String {
        return super .nloSay() + ", " + “my color hide (colorHide)”
    }

}

class Nord : Marcianin {

    override func nloSay() -> String {
        super.nloSay() + ", " + “my height (height)”
    }

}

var nord = Nord(colorHide: “Black”, height: 359, weight: 190)

var reptilion = Reptilion(colorHide: “Red”, height: 499, weight: 340)

var people = [medic,cook,fighter,manager]

var marcianin = [nord,reptilion]

var marsiAndPeople = [people as AnyObject ,marcianin as AnyObject]

#5

Лучше всего иметь одномерный массив [].

var  marsiAndPeople: [AnyObject] = []
marsiAndPeople.append(contentsOf: people)
marsiAndPeople.append(contentsOf: marcianin)

let sortedArray = marsiAndPeople.forEach { $0 is [People] ? $0.sorted { $0.name < $1.name } : $0.sorted { $0.colorHide < $1.colorHide }}

Возможно как-то так. Код не проверялся, возможно придется приводить к типам классов.


#6


#7

Оставьте просто

let sortedArray = marsiAndPeople.forEach { $0 is [People] ? $0.sorted { $0.name &lt; $1.name } : $0.sorted { $0.colorHide &lt; $1.colorHide }}

Это для вашего массива
Я под конец переделал и забыл убрать строки первые.