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最基本的概念,即继承。我的意思是:
创建名为
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。这是因为您的这些属性在两个类中都是通用的吗