Как преобразовать один тип массива объектов в другой? - PullRequest
0 голосов
/ 05 июля 2018

У меня есть два класса Оценка & Учитель .

class Grade: NSObject {

    var grade:String = ""
    var id:String = ""

    init(from dictionary:Parameters) {

        self.grade = dictionary["grade"] as? String ?? ""
        self.id = dictionary["grade_id"] as? String ?? ""
    }
}

class Teacher: NSObject {

    var teacher:String = ""
    var id:String = ""

    init(from dictionary:Parameters) {

        self.teacher = dictionary["teacher"] as? String ?? ""
        self.id = dictionary["teacher_id"] as? String ?? ""
    }
}

Итак, я хочу создать общие классы, которые будут идентификатором и заголовком. Может принимать данные из обоих классов.

Я использую следующий подход, но я не думаю, что это лучший способ для реализации. Дайте мне знать, что может быть лучшим способом.

   func prepareDataSourceForPicker(pickerType:PickerType) {

        var pickerArr = [PickerItem]()
        if pickerType == .grade {

            for value in self.arrGrades {
                let pickerItem:PickerItem = PickerItem()
                pickerItem.title = value.grade
                pickerItem.id = value.id
                pickerArr.append(pickerItem)
            }

        } else if pickerType == .teacher {
            for value in self.arrTeachers {
                let pickerItem:PickerItem = PickerItem()
                pickerItem.title = value.teacher
                pickerItem.id = value.id
                pickerArr.append(pickerItem)
            }
        }
    }

Ответы [ 2 ]

0 голосов
/ 05 июля 2018

Создайте протокол с именем PickerItemProtocol:

protocol PickerItemProtocol {
    var title: String { get }
    var id: String { get }
}

Тогда соответствует Grade и Teacher этому:

extension Grade: PickerItemProtocol {
    var title: String { return grade }
}

extension Teacher : PickerItemProtocol {
    var title: String { return teacher }
}

Теперь в prepareDataSourceForPicker вы можете сделать это:

func prepareDataSourceForPicker(pickerType:PickerType) {

    let dataSource: [PickerItemProtocol]
    switch pickerType {
        case .grade: dataSource = self.arrGrades
        case .teacher: dataSource = self.arrTeachers 
    }
    let pickerArr = dataSource.map { item in
        let pickerItem = PickerItem()
        pickerItem.title = item.title
        pickerItem.id = item.id
        return pickerItem
    }
    // you might want to do something with pickerArr here...
}
0 голосов
/ 05 июля 2018

Я думаю, что лучший способ сделать это в самой основной концепции ООП, т.е. наследования. Что я имею в виду:

  1. Создайте класс BaseModel, имеющий базовые атрибуты (общие атрибуты, которые вы хотите в каждом дочернем классе). в вашем случае это тип, идентификатор и заголовок.
  2. Затем сделайте учитель и оценку его подклассом и добавьте остальные свойства в каждый класс (учитель и класс).
  3. Тогда просто у вас будет тип, идентификатор и название в модели учителя и класса.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...