web-dev-qa-db-fra.com

Argument manquant pour le paramètre # 1 dans l'erreur d'appel pour la fonction sans paramètres. Swift

J'utilise xcode 6 beta 6 et j'obtiens cette erreur étrange pour une fonction qui n'a pas de paramètres.

Voici la fonction

func allStudents ()-> [String]{
    var appDel:AppDelegate = (UIApplication.sharedApplication().delegate as AppDelegate)
    var context:NSManagedObjectContext = appDel.managedObjectContext!
    var request = NSFetchRequest(entityName: "Student")
    request.returnsObjectsAsFaults = false
    //Set error to nil for now
    //TODO: Give an actual error.
    var result:NSArray = context.executeFetchRequest(request, error: nil)

    var students:[String]!
    for child in result{
        var fullname:String = child.valueForKey("firstName") as String + " "
        fullname += child.valueForKey("middleName") as String + " "
        fullname += child.valueForKey("lastName") as String
        students.append(fullname)
    }


    return students
}

et voici l'appel

var all = StudentList.allStudents()

Est-ce un bug ou est-ce que je fais quelque chose de mal ici?

23
Boid

En supposant que StudentList est une classe, c'est-à-dire.

class StudentList {

    func allStudents ()-> [String]{
      ....
    }
}

Ensuite, une expression comme celle-ci

var all = StudentList.allStudents() 

lèvera ladite exception, car allStudents est appliqué à une classe au lieu d'une instance de la classe. La fonction allStudents attend un paramètre self (une référence à l'instance). Il explique le message d'erreur.

Cela sera résolu si vous le faites

var all = StudentList().allStudents()
51
Anthony Kong

Swift a des méthodes d'instance et des méthodes de type. Une méthode d'instance est une méthode qui est appelée à partir d'une instance particulière d'une classe. Une méthode de type est une méthode statique qui est appelée à partir de la classe elle-même.

Méthodes d'instance

Une méthode d'instance ressemblerait à ceci:

class StudentList {

    func allStudents() -> [String] {
      ....
    }
}

Pour que la méthode allStudents soit appelée, la classe StudentsList doit d'abord être initialisée.

let list = StudentsList() // initialize the class
let all = list.allStudents() // call a method on the class instance

Essayer d'appeler une méthode d'instance sur la classe elle-même donne une erreur.

Méthodes de type

Méthodes de type sont des méthodes statiques qui appartiennent à la classe, pas une instance de la classe. Comme mentionné dans les commentaires de la réponse de @ AnthodyKong, une méthode de type peut être créée en utilisant les mots clés class ou static avant func. Les classes sont transmises par référence et les structures sont transmises par valeur, elles sont donc appelées type de référence et type de valeur. Voici à quoi ils ressembleraient:

Type de référence

class StudentList {

    class func allStudents() -> [String] {
      ....
    }
}

Type de valeur

struct StudentList {

    static func allStudents() -> [String] {
      ....
    }
}

Appelez avec

let all = StudentList.allStudents()

Étant donné que allStudents est une méthode de type, la classe (ou struct) n'a pas besoin d'être initialisée en premier.

Voir aussi

13
Suragch