Какие параметры метода вызываются в Swift?

#methods #syntax #swift

#методы #синтаксис #swift

Вопрос:

Я только делаю первые шаги в Swift, и после работы с такими вещами, как PHP, Ruby, JavaScript и Python, все это для меня совершенно ново.

Итак, у меня есть такой код:

 class DerpController: NSURLConnectionDelegate, NSURLConnectionDataDelegate {
    func connection(connection: NSURLConnection!, didReceiveResponse response: NSURLResponse) {
        println("response received")
    }

    func connection(connection: NSURLConnection!, didReceiveData data: NSData!) {
        println("data received")
    }

    func connectionDidFinishLoading(connection: NSURLConnection!) {
        println("request finished")
    }
}
 

Как называются эти вещи: didReceiveResponse , didReceiveData ? Это какой-то идентификатор сообщения или что?

И является func connection ли один перегруженный метод или на самом деле есть два, которые идентифицируются этими именами «didReceive …»?

Комментарии:

1. О, так теперь вы меняете код в вопросе?

2. Я исправил опечатку. что в этом плохого?

3. Потому что мой ответ был об этой опечатке. Как я уже сказал (правильно), если бы это был ваш код, второй метод никогда бы не был вызван.

4. Да, и в этом вы были правы. Итак, я исправил опечатку, потому что это не было целью моего вопроса. В чем проблема?

5. Весь вопрос был (и остается) задан неправильно. Без этой идентичности ваша фраза didReceiveResponse didReceiveResponse не имеет смысла. А без этой идентичности не может быть и речи о «перегруженных» методах.

Ответ №1:

didReceiveResponse является именем внешнего параметра. response и data являются именами локальных параметров.

Это означает, что первая функция вызывается с myDerpController.connection(url, didReceiveResponse:response) помощью . Но в теле функции вы ссылаетесь на параметр как response .

Вторая функция является опечаткой и должна быть didReceiveData

Комментарии:

1. Ах, хорошо, так что это просто «перевод» между двумя именами параметров. В этом есть смысл. Итак, если я просто напишу «didReceiveReponse» вместо «didReceiveRepsonse response», тогда локальная переменная будет просто называться «didReceiveResponse», верно?

2. Это верно. Только, конечно, вы не хотели бы этого делать, так как вам нужно существительное, а не фраза для локальной переменной. Все дело в том, чтобы сделать так, чтобы было легко эмулировать стиль вызова Objective-C.

3. И на самом деле, метод перегружен различными типами параметров. внутреннее / внешнее имя просто для удобства, как я понимаю.

4. Нет, это неверно. Имена внешних параметров являются частью сигнатуры функции. Если типы параметров одинаковы, вы обнаружите, что во избежание ошибки дублирования функции вам нужны разные имена внешних параметров. Очень важно, чтобы это имело место для взаимодействия с Objective-C.

5. Хорошо, итак, функции с одинаковыми именами в Swift перегружены из-за наличия разных имен внешних параметров, которые сопоставляются с функциями с совершенно разными именами в Ocj-C.

Ответ №2:

Это методы делегирования, определенные NSURLConnectionDataDelegate , который является принятым вами протоколом.

В Swift параметр может иметь как внутреннее (параметр, локальное) имя, так и внешнее (аргумент, вызывающий объект) имя. Внутреннее имя ( response: , data: ) полностью зависит от вас; имя, указанное в документах и при завершении кода, является просто «предложением обслуживания». Однако внешнее имя должно соответствовать имени селектора, по которому Objective-C (или любой другой вызывающий объект) будет его искать. Метод вызывается, например connection:didReceiveData: , поэтому для вызова второго параметра необходимо didReceiveData использовать внешнее имя.

Вы также спросили (неуместно) о перегрузке. Перегрузка по типу разрешена в Swift, но не в Objective-C; последний использует только имена (селекторы). Здесь вы сразу многое откусили, потому что решили начать с примера, включающего интенсивное взаимодействие между Swift и Objective-C, для понимания которого вам действительно нужно знать хотя бы начатки обоих языков.