Функция Objective-C с параметрами по умолчанию?

Возможные дубликаты:
Необязательные аргументы в Objective- C 2.0?
Значение аргумента по умолчанию для Objective-C

Я пишу функцию C в Objective-C. Мне нужно значение по умолчанию для моего последнего параметра.

Я пробовал:

foo(int a, int b, int c = 0);

но это С++.

Я также пробовал:

foo(int a, int b, int c)
{
    ...
}

foo(int a, int b)
{
   foo(a, b, 0);
}

Но это тоже C++.

Есть ли способ сделать это в Objective-C?


person Brian Postow    schedule 12.03.2010    source источник
comment
Дубликат stackoverflow.com/questions/871796/ и/или stackoverflow.com /questions/561185/, кажется.   -  person Michael Myers    schedule 13.03.2010
comment
Первый был менее полезен, потому что все либо отвечали за вызов метода, либо за неверное утверждение, что у вас может быть две функции foo. Во-вторых, все вызовы методов...   -  person Brian Postow    schedule 13.03.2010


Ответы (4)


В ObjC нет параметров по умолчанию.

Однако вы можете создать 2 метода:

-(void)fooWithA:(int)a b:(int)b c:(int)c {
  ...
}
-(void)fooWithA:(int)a b:(int)b {
  [self fooWithA:a b:b c:0];
}

Для C: в подмножество C не добавляется ничего особенного с помощью ObjC. Все, что нельзя сделать на чистом C, нельзя сделать и путем компиляции в ObjC. Это означает, что вы не можете использовать параметры по умолчанию или перегружать функцию. Вместо этого создайте 2 функции.

person kennytm    schedule 12.03.2010
comment
@ Кенни, да, но на самом деле это не принадлежит ни к какому классу. это действительно отдельная функция C... - person Brian Postow; 13.03.2010
comment
Тогда, как предлагает Сева, попробуйте Objective-C++. При этом вы сможете смешивать код C++ и Obj-C, вызывать один из другого и т. д. :) - person Macmade; 13.03.2010
comment
Я изменил расширение файла заголовка на hh, расширение исходного файла на mm, а в настройках проекта установлено compile source as according to file type extension, чтобы скомпилировать его как objective-C++. но все равно пишет C does not support default arguments. какое правильное расширение для файлов заголовков objective-C++? - person Necktwi; 06.04.2017
comment
@neckTwi mm. Однако ошибка может произойти, если hh включен в файлы, отличные от ObjC++. - person kennytm; 06.04.2017
comment
У меня есть функция С++ NormalSmooth, объявленная в файле nautical.hpp и определенная в nautical.cpp, которую я переименовал в nautical.hh и nautical.mm соответственно. Теперь я использую функцию NormalSmooth в GameViewController.m. Что мне делать, чтобы избежать вышеуказанной ошибки? Спасибо. - person Necktwi; 06.04.2017
comment
@neckTwi также измените GameViewController на mm. (рассмотрите возможность создать новый пост с вопросом) - person kennytm; 06.04.2017
comment
Сделанный. Пожалуйста, изучите stackoverflow.com/questions/43268483/ спасибо - person Necktwi; 07.04.2017
comment
Не дай бог!!! сделав его Objective-C++, вы навсегда избавитесь от проклятия C++. Например. вы не можете развернуть свой двоичный файл для других, потому что им нужно будет скомпилировать свой собственный код ТОЧНО так же, как и вы. Тот же компилятор, runtime-libs и настройки. C++ не имеет стандартного/непротиворечивого ABI. Самая веская причина, по которой OBJ-C является чистым C, - это наличие совместимого навсегда бинарного файла, который работает везде. Вы используете Obj-C++ только тогда, когда вам нужно связать код C++ с Obj-C. Конечно, не для того, чтобы сохранить несколько простых для понимания строк кода. Если вы все для элегантности - вместо этого используйте Swift (и наслаждайтесь теми же опасностями, что и С++) - person Motti Shneor; 21.02.2019

Нет, target-c не поддерживает параметры по умолчанию. См. похожий вопрос

person Vladimir    schedule 12.03.2010

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

printf() является примером функции, написанной с использованием этого средства (известного как varargs).

printf(const char *restrict format, ...);

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

Если бы вы написали свою функцию таким образом, она могла бы предоставить значение по умолчанию для отсутствующего параметра.

person jlehr    schedule 12.03.2010

Для функции C - нет. Для метода класса Objective C - да, вы просто делаете два метода, один из которых имеет один короткий параметр, вызывая другой метод.

Или вы можете переименовать свои исходники в .mm, и функции C волшебным образом станут C++.

person Seva Alekseyev    schedule 12.03.2010
comment
Это интересная возможность... Мне нужно выяснить стоимость этого в других частях моей интеграции... - person Brian Postow; 13.03.2010
comment
Обратите внимание, что это меняет оформление глобального имени. Вы не сможете вызывать такую ​​функцию извне из источника .m/.c; если есть способ объявить функцию как extern C++, так сказать, я с этим не знаком. Другими словами, если вы собираетесь использовать ObjC++, вам лучше делать это на протяжении всего проекта. - person Seva Alekseyev; 14.03.2010