Я использую xcode 6 beta 6, и я получаю эту странную ошибку для функции, у которой нет параметров.
Вот функция
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
}
и вот вызов
var all = StudentList.allStudents()
Является ли это ошибкой или я делаю что-то неправильно здесь?
Ответ 1
Предполагая, что StudentList
- класс, т.е.
class StudentList {
func allStudents ()-> [String]{
....
}
}
Тогда выражение, подобное этому
var all = StudentList.allStudents()
будет вызывать указанное исключение, потому что allStudents
применяется к классу вместо экземпляра класса. Функция allStudents
ожидает параметр self
(ссылка на экземпляр). Он объясняет сообщение об ошибке.
Это будет разрешено, если вы выполните
var all = StudentList().allStudents()
Ответ 2
Swift имеет методы экземпляра и методы типа. Метод экземпляра - это метод, который вызывается из определенного экземпляра класса. Метод типа - это статический метод, который вызывается из самого класса.
Методы экземпляров
Метод экземпляра будет выглядеть примерно так:
class StudentList {
func allStudents() -> [String] {
....
}
}
Для вызова метода allStudents
сначала необходимо инициализировать класс StudentsList
.
let list = StudentsList() // initialize the class
let all = list.allStudents() // call a method on the class instance
Попытка вызвать метод экземпляра для самого класса дает ошибку.
Методы типа
Методы типов - это статические методы, принадлежащие классу, а не экземпляр класса. Как было указано в комментариях к ответу @AnthodyKong, метод типа может быть создан с использованием ключевых слов class
или static
до func
. Классы передаются по ссылке, а Structs передаются по значению, поэтому они называются ссылочным типом и типом значения. Вот как они выглядят:
Тип ссылки
class StudentList {
class func allStudents() -> [String] {
....
}
}
Тип значения
struct StudentList {
static func allStudents() -> [String] {
....
}
}
Вызов с
let all = StudentList.allStudents()
Поскольку allStudents
- это метод типа, класс (или struct) не нужно сначала инициализировать.
См. также