Swift 如何将一种类型的对象数组转换为另一种类型的对象数组?

Swift 如何将一种类型的对象数组转换为另一种类型的对象数组?,swift,Swift,我有两个班,年级和老师 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 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 ?? ""
    }
}
所以我想创建一个公共类,它将显示id和title。它可以从两个类中获取数据

我使用下面的方法,但我不认为这是最好的实现方法。让我知道什么是最好的方法

   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)
            }
        }
    }

我认为最好的方法是采用OOP最基本的概念,即继承。我的意思是:

  • 创建一个具有基本属性的BaseModel类(您希望在每个子类中使用的公共属性)。在您的情况下,它是类型、id和标题
  • 然后将teacher和grade设置为它的子类,并将其余属性添加到每个类(teacher和grade)
  • 然后,您将在教师和年级模型中都有类型、id和标题

  • 创建名为
    PickerItemProtocol
    的协议:

    protocol PickerItemProtocol {
        var title: String { get }
        var id: String { get }
    }
    
    然后使
    成绩
    教师
    符合以下要求:

    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...
    }
    

    您可以利用这里的协议,因为swift是面向协议的语言,制作一个协议并使两个类都符合该协议。为什么要编写pickerItem.title=item.teacher成绩如何?@Techiee Oops!这是一个复制粘贴错误。现在已修复。为什么您在扩展名中只提供了title why not id?@Techiee,因为您的两个类都已经有了
    id
    属性。我的两个类都有title,但您仍然没有创建一个新属性作为id。这是因为您的这些属性在两个类中都是通用的吗