Tengo un pickerView en el que hay muchos temas. Cada asignatura es una clase como esta:

class subjects {
    var idSubject: String = "";
    var nameSubject: String = "";
    var notesSubject: String = "";
    var colorSubject: String = "";

    init(subjectId: String, subjectName: String, subjectNotes: String, subjectColor: String) {
        idSubject = subjectId
        nameSubject = subjectName
        notesSubject = subjectNotes
        colorSubject = subjectColor
    }

    func printSubject(){
        print(idSubject," - ",nameSubject," - ",notesSubject," - ",colorSubject)
    } 
}

Configuré mi pickerView de esta manera:

public func numberOfComponents(in pickerView: UIPickerView) -> Int{
    return 1
}

public func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int{
    return MenuViewController.subjectsArray.count
}

func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
    self.view.endEditing(true)
    return MenuViewController.subjectsArray[row].nameSubject
}

Quiero seleccionar la fila de un tema en particular, pero no puedo porque con indexOf "No se puede convertir el valor del tipo 'Cadena' al tipo de argumento esperado '(sujetos) arroja -> Bool'" en estas líneas de código:

if let index = MenuViewController.subjectsArray.indexOf("Matematica") {
    self.subjectsMenu.selectRow(index, inComponent: 0, animated: true)
}

¿Alguien puede ayudarme?

0
Marco 30 jul. 2017 a las 16:33

2 respuestas

La mejor respuesta
if let index = MenuViewController.subjectsArray.index(where: {
    $0.nameSubject == "Matematica"
}) {
    self.subjectsMenu.selectRow(index, inComponent: 0, animated: true)
}
1
Adrian Bobrowski 30 jul. 2017 a las 14:32

En lugar de utilizar index (of :), el método apropiado para tal un caso es índice (donde :):

Devuelve el primer índice en el que un elemento de la colección satisface el predicado dado .

Lo cual es aplicable porque tiene una matriz de objetos personalizados (subjects), de la siguiente manera:

if let index = MenuViewController.subjectsArray.index(where: { (subjectsObject) -> Bool in
    subjectsObject.nameSubject == "Matematica"
}) {
    print("found the desired index: \(index)")
    self.subjectsMenu.selectRow(index, inComponent: 0, animated: true)
}

Comentarios adicionales:

  • el nombre de su clase personalizada debe ser "Asunto" en lugar de "asignaturas" . Por lo general, el nombre de las clases se refiere a un objeto singular, con mayúsculas y minúsculas.

  • Al comparar cadenas: subjectsObject.nameSubject == "Matematica", sería mejor recortar y comparar su versión inferior / superior de la misma, de la siguiente manera:

    subjectsObject.nameSubject.lowercased().trimmingCharacters(in: .whitespaces) == "Matematica".lowercased().trimmingCharacters(in: .whitespaces)

1
Ahmad F 30 jul. 2017 a las 14:40