Отсутствует аргумент для параметра №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()

Это баг или я тут что-то не так делаю?


person Boid    schedule 21.08.2014    source источник
comment
Что такое StudentList? Это ваш класс или это переменная (в этом случае она должна иметь нижний регистр s - studentList)   -  person Paulw11    schedule 22.08.2014
comment
Вы уверены, что это линия, на которой он падает? Простая версия этого на игровой площадке работает нормально. Хотя у вас есть одна очевидная ошибка: var students:[String]! никогда не получает значение, оно инициализируется как nil. Вы, вероятно, хотите var students:[String] = [].   -  person Alex Wayne    schedule 22.08.2014
comment
Это не ошибка программы, вызвавшей сбой ее xcode, которая говорит мне, что это неправильно. И да, StudentList — это мой класс.   -  person Boid    schedule 22.08.2014


Ответы (2)


Предполагая, что StudentList является классом, т.е.

class StudentList {

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

Тогда такое выражение

var all = StudentList.allStudents() 

вызовет указанное исключение, потому что allStudents применяется к классу, а не к экземпляру класса. Функция allStudents ожидает параметр self (ссылка на экземпляр). Это объясняет сообщение об ошибке.

Это будет решено, если вы сделаете

var all = StudentList().allStudents()
person Anthony Kong    schedule 22.08.2014
comment
или это должен быть класс/статический метод - person Bryan Chen; 22.08.2014

В 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. Классы передаются по ссылке, а структуры передаются по значению, поэтому они известны как ссылочный тип и тип значения. Вот как они будут выглядеть:

Тип ссылки

class StudentList {

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

Тип значения

struct StudentList {

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

Позвонить с

let all = StudentList.allStudents()

Поскольку allStudents является методом типа, класс (или структуру) не нужно предварительно инициализировать.

См. также

person Suragch    schedule 25.07.2015
comment
Это здорово, но им действительно нужно обновить текст предупреждения, которое вы получаете. Почему бы просто не сказать, что функция должна быть функцией класса, и не предложить исправить это для вас...? - person CommaToast; 24.01.2016
comment
Конечно. Если кто-то когда-нибудь изобретет язык программирования, выдающий интеллектуальные сообщения об ошибках, я его изучаю. - person Suragch; 24.01.2016
comment
Как насчет того, чтобы написать API для clang, в котором, прежде чем показать вам сообщение об ошибке, он сначала ищет переполнение стека и использует алгоритм машинного обучения, чтобы найти наиболее вероятное решение проблемы, а затем просто предоставляет вам ссылку на вопрос :D - person CommaToast; 24.01.2016