Ярлики в Objective-C для об'єднання NSStrings


1129

Чи є ярлики до ( stringByAppendingString:) об'єднання рядків в Objective-C, або ярлики для роботи NSStringв цілому?

Наприклад, я хотів би зробити:

NSString *myString = @"This";
NSString *test = [myString stringByAppendingString:@" is just a test"];

щось подібне:

string myString = "This";
string test = myString + " is just a test";

4
Я просто хотів би запропонувати "@ +" як оператор конкатенації. Я очікую цього в наступному оновлення до Objective-C, kthxbai
powerj1984

44
@NicolasMiari Це не єдина особливість, якої бракує Objective-C. Є й десятки інших. Цитуючи за посиланням Джордао, опублікував: "Objective-C - це, щоб бути тупим, примітивна мова. Порівняйте її з будь-якою сучасною мовою, і вам швидко здається, що її не вистачає". Я згоден. Objective-C (початок 1980-х років) - це C (початок 1970-х років) з додаванням дуже простого і не дуже безпечного типу OOP. Це нормально, але в порівнянні з Java або C #, це відчувається дуже старомодно.
jcsahnwaldt каже, що GoFundMonica

5
@NicolasMiari: Інтерпретована мова? C # і Java - компільовані мови. Компілюється в байт-код, який потім знову компілюється в машинний код.
Жорен

3
Зараз все змінилося: Свіфт (нова мова з яблуком)
простіший

6
Щодо "безпеки безпеки", я думаю, що це проблема стилю. Для когось із походження C # / C ++ наявність різнорідних масивів об'єктів будь-якого типу може здатися дивним, але для тих, хто звик до Objective-C / Cocoa, це форма динамізму та свободи; це перевага за умови, що ви знаєте, що робите. Як і майже все, що стосується С, що молодші програмісти
лунають

Відповіді:


616

Я можу придумати два відповіді ... жодна з них не є такою приємною, як просто наявність оператора конкатенації.

По-перше, використовуйте метод NSMutableString, у якому є appendStringметод, усуваючи певну потребу в додаткових тимчасових рядках.

По-друге, використовуйте метод NSArrayоб'єднання через componentsJoinedByStringметод.


34
Хоча в іншому варіанті є багато результатів, я думаю, що це найкраща відповідь, якщо ви не знаєте всіх своїх рядків під час побудови. Кожен раз, коли ви додаєте рядок, ви створюєте багато накладних витрат. Використання змінної рядка усуває цю проблему.
Елі

22
+1 Згоден w @Eli. Це, як правило, найкращі рішення. NSArray -componentsJoinedByString можна виконати в одному рядку досить добре: string = [[NSArray arrayWithObjects: @ "This", "Is", "A", "Test", nil] componentsJoinedByString: @ ""];
Роб Нап'єр

4
+1 за цю відповідь. [NSMutableString appendString]є більш зручним для пам'яті, ніж [NSString stringByAppendingStrings].
П'єр-Девід Белангер

2
@RobNapier: Тепер із новим синтаксисом буквального масиву це ще краще.
Амо Талпалікар

27
[NSString stringWithFormat:@"%@/%@/%@", three, two, one];Техніка здається найелегантнішою. Це має бути обрана відповідь.
ekillaby

1129

Варіант:

[NSString stringWithFormat:@"%@/%@/%@", one, two, three];

Ще один варіант:

Я здогадуюсь, що ви не задоволені кількома додатками (a + b + c + d), і в цьому випадку ви могли б зробити:

NSLog(@"%@", [Util append:one, @" ", two, nil]); // "one two"
NSLog(@"%@", [Util append:three, @"/", two, @"/", one, nil]); // three/two/one

використовуючи щось подібне

+ (NSString *) append:(id) first, ...
{
    NSString * result = @"";
    id eachArg;
    va_list alist;
    if(first)
    {
        result = [result stringByAppendingString:first];
        va_start(alist, first);
        while (eachArg = va_arg(alist, id)) 
        result = [result stringByAppendingString:eachArg];
        va_end(alist);
    }
    return result;
}

8
@pablasso Погодився. Метод Util досить некрасивий. Якщо ви цього хотіли, це слід робити як категорію NSString з назвою типу + stringByAppendingStrings :. Навіть функція прямого виклику з таким іменем, як NSStringForAppendedStrings (...) була б кращою за статичний метод у класі типу Util (все, що з ім'ям "Util", мабуть, погано враховується). Ця функція також краще реалізується за допомогою NSMutableString та -appendString, щоб уникнути створення необмеженого набору тимчасових автоматично випущених NSStrings.
Роб Нап’єр

1
З великими струнами це може втратити пам'ять. Рекомендується щось більше схоже на StringBuilder в реальних мовах програмування. Тоді ви могли просто зрозуміти, скільки потрібно пам’яті, перш ніж ви дійсно почнете додавати. Вищенаведений підхід може бути відновлений для цього. Однак було б краще зробити об’єкт StringBuilder, оскільки це врятує його користувача від необхідності відслідковувати список усіх рядків, які їм потрібні.
Джордж

як ви імпортуєте Util? цей IDE засмучує (не пропонується "імпортувати щось. Утиліти", як на затемнення, і я ніде не згадую "Util". Це клас, який я повинен
кодувати

stringWithFormat не тільки дуже елегантний, він також набагато потужніший. Ви використовуєте його з @ "% @% @" для об'єднання двох рядків, @ "% @% @% @" для об'єднання трьох рядків, але ви можете помістити все зайві символи, друкувати номери, змінити параметри, якщо вам подобається тощо. . Рядок формату може бути локалізований, що робить його в десять разів потужнішим. Зв'язок рядків призначений для новачків.
gnasher729

150

Якщо у вас є 2 літератури NSString , ви також можете просто зробити це:

NSString *joinedFromLiterals = @"ONE " @"MILLION " @"YEARS " @"DUNGEON!!!";

Це також корисно для приєднання до #defines:

#define STRINGA @"Also, I don't know "
#define STRINGB @"where food comes from."
#define JOINED STRINGA STRINGB

Насолоджуйтесь.


13
@ CristiBăluță :) Але це працює лише з літералами, а не з динамічно створеними екземплярами NSString.
Йоханнес Фаренкруг

9
Ви фактично не потребуєте @s на рядках після першого. @"I" " really" " enjoy"...
Кевін

Напевно, ви хочете вставити STRINGA та STRINGB в круглі дужки, інакше ви отримаєте дивні результати, коли макрос буде вирішено. #define ПРИЄДНАЄТЬСЯ (STRINGA STRINGB)
digory doo

@JohannesFahrenkrug Тоді чому це NSString* const SQL_CREATE_TABLE_str = @"CREATE TABLE IF NOT EXISTS " TABLE_NAME @" (...);";не працює? У мене є Expected '@' in programпомилка :(
Vagif

@Vagif як це TABLE_NAMEвизначено?
Йоханнес Фаренкруг

75

Я постійно повертаюся до цієї публікації і завжди закінчую сортування відповідей, щоб знайти це просте рішення, яке працює з необхідною кількістю змінних:

[NSString stringWithFormat:@"%@/%@/%@", three, two, one];

Наприклад:

NSString *urlForHttpGet = [NSString stringWithFormat:@"http://example.com/login/username/%@/userid/%i", userName, userId];

48

Створіть метод:

- (NSString *)strCat: (NSString *)one: (NSString *)two
{
    NSString *myString;
    myString = [NSString stringWithFormat:@"%@%@", one , two];
    return myString;
}

Потім у будь-якій функції вам це потрібно, встановіть рядок або текстове поле або будь-яке інше на зворотне значення цієї функції.

Або, щоб зробити ярлик, перетворіть NSString в рядок C ++ і використовуйте там "+".


Це найпростіше рішення.
GeneCode

44

Ну, як двокрапка виду спеціального символу, але є частиною сигнатури методи, можна exted NSStringз категорією , щоб додати НЕ-ідіоматичний стиль конкатенації:

[@"This " : @"feels " : @"almost like " : @"concatenation with operators"];

Ви можете визначити стільки аргументів, розділених двокрапкою, як вам здається корисним ... ;-)

На користь, я також додав concat:змінні аргументи, які приймають nilперерваний список рядків.

//  NSString+Concatenation.h

#import <Foundation/Foundation.h>

@interface NSString (Concatenation)

- (NSString *):(NSString *)a;
- (NSString *):(NSString *)a :(NSString *)b;
- (NSString *):(NSString *)a :(NSString *)b :(NSString *)c;
- (NSString *):(NSString *)a :(NSString *)b :(NSString *)c :(NSString *)d;

- (NSString *)concat:(NSString *)strings, ...;

@end

//  NSString+Concatenation.m

#import "NSString+Concatenation.h"

@implementation NSString (Concatenation)

- (NSString *):(NSString *)a { return [self stringByAppendingString:a];}
- (NSString *):(NSString *)a :(NSString *)b { return [[self:a]:b];}
- (NSString *):(NSString *)a :(NSString *)b :(NSString *)c
    { return [[[self:a]:b]:c]; }
- (NSString *):(NSString *)a :(NSString *)b :(NSString *)c :(NSString *)d
    { return [[[[self:a]:b]:c]:d];}

- (NSString *)concat:(NSString *)strings, ...
{
    va_list args;
    va_start(args, strings);

    NSString *s;    
    NSString *con = [self stringByAppendingString:strings];

    while((s = va_arg(args, NSString *))) 
        con = [con stringByAppendingString:s];

    va_end(args);
    return con;
}
@end

//  NSString+ConcatenationTest.h

#import <SenTestingKit/SenTestingKit.h>
#import "NSString+Concatenation.h"

@interface NSString_ConcatenationTest : SenTestCase

@end

//  NSString+ConcatenationTest.m

#import "NSString+ConcatenationTest.h"

@implementation NSString_ConcatenationTest

- (void)testSimpleConcatenation 
{
    STAssertEqualObjects([@"a":@"b"], @"ab", nil);
    STAssertEqualObjects([@"a":@"b":@"c"], @"abc", nil);
    STAssertEqualObjects([@"a":@"b":@"c":@"d"], @"abcd", nil);
    STAssertEqualObjects([@"a":@"b":@"c":@"d":@"e"], @"abcde", nil);
    STAssertEqualObjects([@"this " : @"is " : @"string " : @"concatenation"],
     @"this is string concatenation", nil);
}

- (void)testVarArgConcatenation 
{
    NSString *concatenation = [@"a" concat:@"b", nil];
    STAssertEqualObjects(concatenation, @"ab", nil);

    concatenation = [concatenation concat:@"c", @"d", concatenation, nil];
    STAssertEqualObjects(concatenation, @"abcdab", nil);
}

20
Я заявив про це рік тому, тому що це не дуже хороша відповідь. Щоб впоратися з об'єднанням великої кількості рядків, реалізація Palimondo вимагає або реалізувати велику кількість дуже схожих на вигляд методів, або викликати методи кілька разів, в результаті чого з'являється великий фрагмент коду, який по суті просто об'єднує рядки. Використовуючи такий підхід, ви не отримаєте жодної вигоди від простого stringWithFormat:. Не кажучи вже про відсутність названих параметрів, які є не тільки нестандартними, але й заплутаними.
FreeAsInBeer

2
Первісний запитувач згадував stringByAppendingString, і він ніколи нічого не говорив про використання більш ніж двох аргументів. Мені подобається ця відповідь краще, ніж прийнята. Це досить розумно.
судо

32

Використовуйте stringByAppendingString:цей спосіб:

NSString *string1, *string2, *result;

string1 = @"This is ";
string2 = @"my string.";

result = [result stringByAppendingString:string1];
result = [result stringByAppendingString:string2];

АБО

result = [result stringByAppendingString:@"This is "];
result = [result stringByAppendingString:@"my string."];

34
Ти розумієш, що ти пропонуєш саме те, що він хотів не робити, правда?
SilverSideDown

стільки витоку!
RamGrg

30

Макрос:

// stringConcat(...)
//     A shortcut for concatenating strings (or objects' string representations).
//     Input: Any number of non-nil NSObjects.
//     Output: All arguments concatenated together into a single NSString.

#define stringConcat(...) \
    [@[__VA_ARGS__] componentsJoinedByString:@""]

Випробування:

- (void)testStringConcat {
    NSString *actual;

    actual = stringConcat(); //might not make sense, but it's still a valid expression.
    STAssertEqualObjects(@"", actual, @"stringConcat");

    actual = stringConcat(@"A");
    STAssertEqualObjects(@"A", actual, @"stringConcat");

    actual = stringConcat(@"A", @"B");
    STAssertEqualObjects(@"AB", actual, @"stringConcat");

    actual = stringConcat(@"A", @"B", @"C");
    STAssertEqualObjects(@"ABC", actual, @"stringConcat");

    // works on all NSObjects (not just strings):
    actual = stringConcat(@1, @" ", @2, @" ", @3);
    STAssertEqualObjects(@"1 2 3", actual, @"stringConcat");
}

Альтернативний макрос: (якщо ви хочете застосувати мінімальну кількість аргументів)

// stringConcat(...)
//     A shortcut for concatenating strings (or objects' string representations).
//     Input: Two or more non-nil NSObjects.
//     Output: All arguments concatenated together into a single NSString.

#define stringConcat(str1, str2, ...) \
    [@[ str1, str2, ##__VA_ARGS__] componentsJoinedByString:@""];

2
Я не перевіряв це питання деякий час, але я схиляюся до того, щоб прийняти це як правильну відповідь після всіх цих років!
typeoneerror

1
Це також, мабуть, має кращу поведінку, ніж -[NSString stringByAppendingString:]у цьому випадку використання - з першим ви отримаєте виняток, якщо аргумент є, nilале ні, якщо є приймачем. Таким чином, можливо, 50% шансів на помилку у вашій фідерній стрічці виходить з ладу і 50% - на виняток. Завдяки цьому stringConcatви гарантуєте виняток у будь- nilякій точці списку. Що принаймні є більш передбачуваним.
Томмі

27

Створюючи запити на веб-сервіси, я вважаю, що робити щось на зразок наступного дуже просто і робить конкатенацію читабельною в Xcode:

NSString* postBody = {
    @"<?xml version=\"1.0\" encoding=\"utf-8\"?>"
    @"<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">"
    @" <soap:Body>"
    @"  <WebServiceMethod xmlns=\"\">"
    @"   <parameter>test</parameter>"
    @"  </WebServiceMethod>"
    @" </soap:Body>"
    @"</soap:Envelope>"
};

Чи можете ви пояснити, що для цього синтаксису робиться об'єктив-c noob? Це створює масив рядків і якось об'єднує їх? Посилання на будь-які документи теж було б крутим.
Норман Н

2
@NormanH: Це фактично частина мови С. Після невеликого копання, я був в змозі знайти це . Він зазначається під фазою "Зв'язування рядків": Усі суміжні рядкові та широкорядкові літерали є об'єднаними. Наприклад, "String" "concatenation" перетворюється на "Stcate concatenation".
FreeAsInBeer

27

Ярлик, створивши макрос AppendString (AS) ...

#define AS (A, B) [(A) stringByAppendingString: (B)]
NSString * myString = @ "Це"; NSString * test = AS (myString, @ "просто тест");

Примітка:

Якщо ви використовуєте макрос, звичайно, просто це робите з різними аргументами, дивіться відповідь EthanB.


Класно! Я все ще думаю, що Util вище - це набагато більш елегантне рішення; Ви можете додати лише один рядок із цим макросом, правда?
typeoneerror

1
Правда, макрос AS, що додається вище, виконує одне додавання в рядку коду. Якщо декілька додатків є загальною потребою, тоді можна створити більше макросів. Наприклад, макрос для додавання двох рядків: <pre> #define A2S (A, B, C) [[(A) stringByAppendingString: (B)] stringByAppendingString: (C)] </pre>

2
Або просто укоротіть необхідне введення тексту за допомогою макросу типу "#define AS stringByAppendingString", а потім просто скористайтеся "AS", де зазвичай вводиться "stringByAppendingString", і насолоджуйтесь декількома додатками в рядку коду.

15
Проблема цих макросів полягає в тому, що вони підривають одну з головних цілей Objective-C, а саме - читабельність. Надзвичайно незрозуміло, що робить "AS". Заощадження декількох натискань клавіш (більшість з яких обробляється автозавершенням) за рахунок читабельності рідко є корисним компромісом. Є винятки (синтаксис @ "" набагато читабельніший, ніж використання + stringWithUTF8String: кожен раз), але мета все ж повинна бути читабельністю, а не просто стислістю. Ви пишете один раз, але налагоджуєте назавжди.
Роб Нап'єр

Привіт Роб - я не можу з цим погодитися. Звичайно, "AS" - це погана назва. Його слід назвати, можливо, "CAT".
Fattie

13
NSString *label1 = @"Process Name: ";
NSString *label2 = @"Process Id: ";
NSString *processName = [[NSProcessInfo processInfo] processName];
NSString *processID = [NSString stringWithFormat:@"%d", [[NSProcessInfo processInfo] processIdentifier]];
NSString *testConcat = [NSString stringWithFormat:@"%@ %@ %@ %@", label1, processName, label2, processID];

11

Ось простий спосіб, використовуючи новий синтаксис прямого масиву масиву:

NSString * s = [@[@"one ", @"two ", @"three"] componentsJoinedByString:@""];
                  ^^^^^^^ create array ^^^^^
                                               ^^^^^^^ concatenate ^^^^^

9
NSString *myString = @"This";
NSString *test = [myString stringByAppendingString:@" is just a test"];

Через пару років разом з Objective CI думаю, що це найкращий спосіб співпрацювати з Objective C, щоб досягти того, чого ви намагаєтеся досягти.

Почніть вводити "N" у вашій програмі Xcode, і вона автоматично завершиться до "NSString". введіть "str" ​​і він автоматично завершується до "stringByAppendingString". Тож натискання клавіш досить обмежені.

Після того, як ви побачите натискання клавіші "@" та вкладка, процес написання читаного коду більше не стає проблемою. Це лише питання адаптації.


Ти розумієш, що ти пропонуєш саме те, що він хотів не робити, правда?
Користувач, який не є користувачем

8

Єдиний спосіб c = [a stringByAppendingString: b]скоротити - використовувати автозаповнення біля stточки. +Оператор є частиною С, який не знає про об'єкти , Objective-C.


Ти розумієш, що ти пропонуєш саме те, що він хотів не робити, правда? Принаймні, #defineміг би бути використаний для його скорочення.
Користувач, який не є користувачем

8

Як щодо скорочення stringByAppendingStringта використання #define :

#define and stringByAppendingString

Таким чином, ви б використовували:

NSString* myString = [@"Hello " and @"world"];

Проблема полягає в тому, що вона працює лише для двох рядків, вам потрібно ввести додаткові дужки, щоб отримати більше додатків:

NSString* myString = [[@"Hello" and: @" world"] and: @" again"];

XCode7 більше не дозволить вам використовувати цю опцію - говорить "і" - це зарезервоване слово. Однак, ви можете використовувати "cat" замість цього для conCATenation. Я це зробив, і ваше рішення працює ідеально і надзвичайно просто.
Воломіке


7
NSString *label1 = @"Process Name: ";
NSString *label2 = @"Process Id: ";
NSString *processName = [[NSProcessInfo processInfo] processName];
NSString *processID = [NSString stringWithFormat:@"%d", [[NSProcessInfo processInfo] processIdentifier]];
NSString *testConcat = [NSString stringWithFormat:@"%@ %@ %@ %@", label1, processName, label2, processID];

6

Я спробував цей код. це працює для мене.

NSMutableString * myString=[[NSMutableString alloc]init];
myString=[myString stringByAppendingString:@"first value"];
myString=[myString stringByAppendingString:@"second string"];

2
Це найгірше зловживання NSMutableString коли-небудь. Вся суть NSMutableString полягає в тому, що вам не потрібні методи створення автоматично випущених рядків, але ви можете змінювати саму рядок.
gnasher729

Погодьтеся. Принаймні використовувати, appendString:якщо ви використовуєте NSMutableString.
Користувач, який не є користувачем

6

На lldbпанелі спробували наступне

[NSString stringWithFormat:@"%@/%@/%@", three, two, one];

які помилки.

замість цього використовуйте alloc та initWithFormatметод:

[[NSString alloc] initWithFormat:@"%@/%@/%@", @"three", @"two", @"one"];

1
... хотілося б, щоб я мав достатньо репутації для коментарів, але сподіваюся, що це допоможе комусь іншому.
Ентоні Де Суза

4

Це для кращого ведення журналу та ведення журналу - на основі відмінного методу множинних аргументів dicius. Я визначаю клас Logger і називаю його так:

[Logger log: @"foobar ", @" asdads ", theString, nil];

Майже добре, за винятком того, що потрібно закінчувати вар-арг з "нулем", але я вважаю, що це не обійдеться в "Objective-C".

Logger.h

@interface Logger : NSObject {
}
+ (void) log: (id) first, ...;
@end

Журнал.m

@implementation Logger

+ (void) log: (id) first, ...
{
    // TODO: make efficient; handle arguments other than strings
    // thanks to @diciu http://stackoverflow.com/questions/510269/how-do-i-concatenate-strings-in-objective-c
    NSString * result = @"";
    id eachArg;
    va_list alist;
    if(first)
    {
        result = [result stringByAppendingString:first];
        va_start(alist, first);
        while (eachArg = va_arg(alist, id)) 
        {
            result = [result stringByAppendingString:eachArg];
        }
        va_end(alist);
    }
    NSLog(@"%@", result);
}

@end 

Для того, щоб наводити лише лаконічні рядки, я б визначив категорію на NSString і додав до неї статичний (+) конкатенатний метод, який виглядає точно як метод журналу вище, за винятком того, що він повертає рядок. Це на NSString, тому що це строковий метод, і він статичний, тому що ви хочете створити нову рядок з 1-N рядків, а не викликати її в жодному з рядків, що є частиною додавання.


4
NSNumber *lat = [NSNumber numberWithDouble:destinationMapView.camera.target.latitude];
NSNumber *lon = [NSNumber numberWithDouble:destinationMapView.camera.target.longitude];
NSString *DesconCatenated = [NSString stringWithFormat:@"%@|%@",lat,lon];

3

Спробуйте stringWithFormat:

NSString *myString = [NSString stringWithFormat:@"%@ %@ %@ %d", "The", "Answer", "Is", 42];

Чому для цього є 2 поточних канали? Це тому, що про це вже говорилося в іншій відповіді?
Реймій

3

У роботі з рядками часто мені простіше зробити вихідний файл ObjC ++, тоді я можу об'єднати std :: рядки, використовуючи другий метод, показаний у питанні.

std::string stdstr = [nsstr UTF8String];

//easier to read and more portable string manipulation goes here...

NSString* nsstr = [NSString stringWithUTF8String:stdstr.c_str()];

3

Мій кращий метод такий:

NSString *firstString = @"foo";
NSString *secondString = @"bar";
NSString *thirdString = @"baz";

NSString *joinedString = [@[firstString, secondString, thirdString] join];

Ви можете досягти цього, додавши метод приєднання до NSArray з категорією:

#import "NSArray+Join.h"
@implementation NSArray (Join)
-(NSString *)join
{
    return [self componentsJoinedByString:@""];
}
@end

@[]це коротке визначення для NSArray, я думаю, що це найшвидший метод об'єднання рядків.

Якщо ви не хочете використовувати категорію, використовуйте безпосередньо componentsJoinedByString:метод:

NSString *joinedString = [@[firstString, secondString, thirdString] componentsJoinedByString:@""];

3

Ви можете використовувати NSArray як

NSString *string1=@"This"

NSString *string2=@"is just"

NSString *string3=@"a test"  

NSArray *myStrings = [[NSArray alloc] initWithObjects:string1, string2, string3,nil];

NSString *fullLengthString = [myStrings componentsJoinedByString:@" "];

або

ви можете використовувати

NSString *imageFullName=[NSString stringWithFormat:@"%@ %@ %@.", string1,string2,string3];

1

Будь-який із цих форматів працює в XCode7, коли я тестував:

NSString *sTest1 = {@"This" " and that" " and one more"};
NSString *sTest2 = {
  @"This"
  " and that"
  " and one more"
};

NSLog(@"\n%@\n\n%@",sTest1,sTest2);

Чомусь вам потрібен лише символ @ оператора в першій строці суміші.

Однак це не працює зі змінною вставкою. Для цього ви можете використовувати це надзвичайно просте рішення за винятком використання макросу на "cat" замість "і".


як це зробити? наприклад: sTest3 = sTest1 + sTest2;

@ user285594 У цьому і полягало питання: синтаксис заборонений у Objective-C. Дивіться інші відповіді.
Користувач, який не є користувачем

1

Для всіх любителів Objective C, які потребують цього в тесті користувальницького інтерфейсу:

-(void) clearTextField:(XCUIElement*) textField{

    NSString* currentInput = (NSString*) textField.value;
    NSMutableString* deleteString = [NSMutableString new];

    for(int i = 0; i < currentInput.length; ++i) {
        [deleteString appendString: [NSString stringWithFormat:@"%c", 8]];
    }
    [textField typeText:deleteString];
}


0

Давайте уявимо, що ти не знаєш, скільки струн там.

NSMutableArray *arrForStrings = [[NSMutableArray alloc] init];
for (int i=0; i<[allMyStrings count]; i++) {
    NSString *str = [allMyStrings objectAtIndex:i];
    [arrForStrings addObject:str];
}
NSString *readyString = [[arrForStrings mutableCopy] componentsJoinedByString:@", "];
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.