ios - una - tipos de funciones en lenguaje c
Falta el argumento para el parámetro#1 en el error de llamada para una función sin parámetros. Rápido (2)
Estoy usando xcode 6 beta 6 y obtengo este error extraño para una función que no tiene parámetros.
Aquí está la función
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
}
y aqui esta la llamada
var all = StudentList.allStudents()
¿Es esto un error o estoy haciendo algo mal aquí?
Asumiendo que StudentList
es una clase, es decir
class StudentList {
func allStudents ()-> [String]{
....
}
}
Entonces una expresión como esta
var all = StudentList.allStudents()
lanzará dicha excepción, porque allStudents
se aplica a una clase en lugar de a una instancia de la clase. La función allStudents
está esperando un parámetro self
(una referencia a la instancia). Explica el mensaje de error.
Esto se resolverá si lo haces
var all = StudentList().allStudents()
Swift tiene métodos de instancia y métodos de tipo. Un método de instancia es un método que se llama desde una instancia particular de una clase. Un método de tipo es un método estático que se llama desde la propia clase.
Métodos de instancia
Un método de instancia sería algo como esto:
class StudentList {
func allStudents() -> [String] {
....
}
}
Para que se allStudents
método allStudents
, primero debe inicializarse la clase StudentsList
.
let list = StudentsList() // initialize the class
let all = list.allStudents() // call a method on the class instance
Intentar llamar a un método de instancia en la clase en sí da un error.
Métodos de tipo
Los métodos de tipo son métodos estáticos que pertenecen a la clase, no una instancia de la clase. Como se mencionó en los comentarios a la respuesta de @ AnthodyKong, se puede crear un Método de Tipo usando la class
o palabras clave static
antes de func
. Las clases se pasan por referencia y las estructuras se pasan por valor, por lo que se conocen como tipo de referencia y tipo de valor. Aquí están los que se verían:
Tipo de referencia
class StudentList {
class func allStudents() -> [String] {
....
}
}
Tipo de valor
struct StudentList {
static func allStudents() -> [String] {
....
}
}
Llamar con
let all = StudentList.allStudents()
Debido a que allStudents
es un método de tipo, la clase (o estructura) no necesita inicializarse primero.
Ver también