Отсутствует аргумент для параметра # 1 в ошибке вызова для функции без параметров. стриж

Я использую 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) не нужно сначала инициализировать.

См. также