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?
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()
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.
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 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