Как я передаю несколько параметров в Objective C?

Я нашел следующие решения этой проблемы с помощью плагина для обработки аннотации Lombok во время компиляции.

Мне пришлось выполнить следующие шаги в build.gradle:

1) Добавить id "net.ltgt.apt" version "0.15" в раздел плагинов.

2) Добавить maven { url 'https://projectlombok.org/edge-releases' } в раздел репозиториев.

3) Добавьте следующее в раздел зависимостей:

compileOnly 'org.projectlombok:lombok:edge-SNAPSHOT'
apt 'org.projectlombok:lombok:edge-SNAPSHOT'

compileOnly 'org.projectlombok:lombok:1.18:6'
annotationProcessor 'org.projectlombok:lombok:1.18:6'

4) Добавьте задачу:

tasks.withType(JavaCompile) {
  options.annotationProcessorPath = configurations.apt
}

Это позволит успешно завершить сборку.

Обновление от 29.03.2009: Этот обходной путь также работает с Gradle 5.3, Java JDK 10

Спасибо.

172
задан Jim Puls 6 April 2009 в 19:46
поделиться

4 ответа

Objective C не имеет названных параметров, таким образом, все на левой стороне двоеточия - часть имени метода. Например,

getBusStops: forTime:

название метода. Имя разбито так, это может быть более описательным. Вы могли просто назвать свой метод

getBusStops: :

но это не говорит Вам очень о втором параметре.

114
ответ дан Terry Wilcox 23 November 2019 в 20:39
поделиться

Необходимо разграничить каждое название параметра с a ":" по крайней мере. Технически имя является дополнительным, но оно рекомендуется для удобочитаемости. Таким образом, Вы могли записать:

- (NSMutableArray*)getBusStops:(NSString*)busStop :(NSSTimeInterval*)timeInterval;

или что Вы предложили:

- (NSMutableArray*)getBusStops:(NSString*)busStop forTime:(NSSTimeInterval*)timeInterval;
153
ответ дан E.M. 23 November 2019 в 20:39
поделиться

Да; синтаксис метода Objective C похож на это по нескольким причинам; один из них - то, так, чтобы было ясно, каковы параметры, которые Вы указываете. Например, если Вы добавляете объект к NSMutableArray в определенном индексе Вы сделали бы это с помощью метода:

- (void)insertObject:(id)anObject atIndex:(NSUInteger)index;

Этот метод называют insertObject:atIndex: и ясно, что объект вставляется в указанном индексе.

На практике, добавляя строку "Привет, Мир!" в индексе 5 NSMutableArray названный array был бы назван следующим образом:

NSString *obj = @"Hello, World!";
int index = 5;

[array insertObject:obj atIndex:index];

Это также уменьшает неоднозначность между порядком параметров метода, гарантируя, чтобы Вы передали параметр объекта сначала, затем индексный параметр. Это становится более полезным при использовании функций, которые берут большое количество аргументов, и уменьшает ошибку мимоходом аргументы.

Кроме того, соглашение о присвоении имен метода - такой, потому что Objective C не поддерживает перегрузку; однако, если Вы хотите записать метод, который делает то же задание, но берет различные типы данных, это может быть выполнено; возьмите, например, NSNumber класс; это имеет несколько методов создания объекта, включая:

  • + (id)numberWithBool:(BOOL)value;
  • + (id)numberWithFloat:(float)value;
  • + (id)numberWithDouble:(double)value;

На языке, таком как C++, Вы просто перегрузили бы метод числа, чтобы позволить различным типам данных быть переданными как аргумент; однако, в Objective C, этот синтаксис позволяет нескольким различным вариантам той же функции быть реализованными, меняя имя метода для каждого варианта функции.

68
ответ дан Alex Rozanski 23 November 2019 в 20:39
поделиться

Текст перед каждым параметром является частью имени метода. От Вашего примера название метода на самом деле

-getBusStops:forTime:

Каждый: представляет аргумент. В вызове метода имя метода разделяется в :s и аргументы появляются после :s. например.

[getBusStops: arg1 forTime: arg2]
23
ответ дан sigjuice 23 November 2019 в 20:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: