Има ли лесен начин да преобразувате клас на обекти от тип C на NSStrings в параметри за функция, приемаща променлив списък с char *? По-конкретно имам функция като:
- (празно) someFunction: (NSSomething *) var
че искам да препраща към функция С като
void someCFunction (char * var, ...)
Има ли лесен начин да се направи това?
Отговори:
1 за отговор № 1Не, можете да направите това, което искате, само ако броят на аргументите, които предавате, е известен при компилацията. Ако просто искате да конвертирате един низ, използвайте -UTF8String
съобщение:
// Example with two strings
NSString *str1 = ...;
NSString *str2 = ...;
someCFunction([str1 UTF8String], [str2 UTF8String]); // etc.
Но ако броят на струните ще вариратрябва да използвате различен приложния програмен интерфейс (API), ако има такъв.Например, ако има API, който е взел масив от низове, можете да конвертирате масива Objective-C в C масив:
// This function takes a variable number of strings. Note: in C/Objective-C
// (but not in C++/Objective-C++), it"s not legal to convert "char **" to
// "char *const *", so you may sometimes need a cast to call this function
void someCFunction(const char *const *stringArray, int numStrings)
{
...
}
...
// Convert Objective-C array to C array
NSArray *objCArray = ...;
int numStrings = [objCArray count];
char **cStrArray = malloc(numStrings * sizeof(char*));
for (int i = 0; i < count; i++)
cStrArray[i] = [[objCArray objectAtIndex:i] UTF8String];
// Call the function; see comment above for note on cast
someCFunction((const char *const *)cStrArray, numStrings);
// Don"t leak memory
free(cStrArray);
0 за отговор № 2
Това би направило този трик:
NSString *string = @"testing string"
const char * p1=[string UTF8String];
char * p2;
p2 = const_cast<char *>(p1);
0 за отговор № 3
Да, това може да се направи и е обяснено тук:
Как да създадете NSString от формат низ като @ "xxx =% @, yyy =% @" и NSArray на обекти?
И тук:
http://www.cocoawithlove.com/2009/05/variable-argument-lists-in-cocoa.html
С модификации за ARC тук:
Как да създадете NSString от формат низ като @ "xxx =% @, yyy =% @" и NSArray на обекти?
Също така, променливите аргументи не са статични илисилно напечатани, както изглежда изглежда, че показва другият плакат. Всъщност, няма ясна индикация в избирателя колко аргументи наистина имате. Определянето на броя на аргументите обикновено се свежда до това, че трябва да посочим числото чрез параметър за броя, като използваме терминатор с нулева стойност или да го изведем от низ от формат a la (print) *. Това е честно защо фамилията от функции на C (s) print * е източник на много грешки, които вече са много по-безопасни от компилатора XCode / Clang / GCC, който сега предупреждава.
Като отстрани можете да се приближите статичнопроменливи аргументи в C ++ чрез създаване на шаблонен метод, който приема масив с неопределен размер. Това обикновено се счита за лоша форма, макар че компилаторът генерира отделни случаи за всеки размер на масива, видян от компилатора (шаблонът подути).