Como preludio, soy nueva en swift.

Estoy creando una aplicación a partir de una clase, que tiene un modelo con una matriz. Accediendo a la matriz, estoy intentando establecer el texto de la etiqueta con una nueva pregunta.

El error que recibo de xCode es
Cannot convert value of type 'Question?' to specified type 'String'

En mi modelo, tengo un archivo .swift con lo siguiente que define mi clase de pregunta

  class Question {

    let questionText : String
    let answer : Bool

    init(text: String, correctAnswer: Bool) {
        questionText = text
        answer = correctAnswer
    }
}

En otro .swift tengo la gama real de preguntas.

class QuestionBank {
    var list = [Question]()

    init() {

        let item = Question(text: "Valentine\'s day is banned in Saudi Arabia.", correctAnswer: true)


        list.append(item)


        list.append(Question(text: "A slug\'s blood is green.", correctAnswer: true))

        list.append(Question(text: "Approximately one quarter of human bones are in the feet.", correctAnswer: true))



    }
}

My Main Storyboard contiene el siguiente código. Aquí es donde recibo mi error real; Parece que Swift está interpretando la [Pregunta] extraída de la definición de pregunta de mi clase como un tipo de datos, que debería haber sido una cadena.

class ViewController: UIViewController {

       let allQuestions = QuestionBank()
       var pickedAnswer : Bool = false


    @IBOutlet weak var questionLabel: UILabel!
    @IBOutlet weak var scoreLabel: UILabel!
    @IBOutlet var progressBar: UIView!
    @IBOutlet weak var progressLabel: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()

        let firstQuestion = allQuestions.list.randomElement()
        questionLabel.text = firstQuestion!.questionText

    }


    @IBAction func answerPressed(_ sender: AnyObject) {
        if sender.tag == 1 {
            print("True")
        } else if sender.tag == 2 {
            print("False")
        }


    }


    func updateUI() {

    }


    func nextQuestion() {
        var newQuetion : String = allQuestions.list.randomElement()



    }


    func checkAnswer() {

    }


    func startOver() {

    }



}

¿Qué estoy haciendo mal con mi tipo de datos, la última vez que verifiqué, pregunta? no es un tipo de conjunto de datos y "¿No se puede convertir el valor del tipo 'Pregunta?' al tipo especificado 'Cadena' me lleva a creer que tengo un problema con el tipo de datos.

Gracias por cualquier ayuda.

-2
Christopher Allen 16 oct. 2018 a las 15:30

2 respuestas

La mejor respuesta

El mensaje de error es perfectamente sencillo. Tu estas diciendo:

var newQuetion : String = allQuestions.list.randomElement()

Pero allQuestions.list es una matriz de Pregunta, no una matriz de Cadena. Por tanto, un elemento aleatorio de esa matriz es una Pregunta, no una Cadena. Insiste en que newQuetion (sic) sea una cadena. No lo es. Solo escribe

var newQuetion = allQuestions.list.randomElement()

Y proceda desde allí. Su newQuetion ahora será una pregunta opcional. Si necesita una cadena, debe desenvolver la Pregunta opcional y obtener su questionText.

4
matt 16 oct. 2018 a las 12:34

Esto no se compilará, ya que el objeto devuelto por randomElement no es una instancia de String sino Question

var newQuetion : String = allQuestions.list.randomElement()

Debe ser:

var newQuetion : Question? = allQuestions.list.randomElement()

Es importante que Question? sea opcional porque Array<Element>.randomElement() devuelve Element?

-2
iAdjunct 16 oct. 2018 a las 14:44