Существуют ли какие-либо сокращения для (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";
[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;
}
Я могу предложить два варианта ответа... но ни один из них не является таким приятным, как просто наличие оператора конкатенации.
Во-первых, используйте NSMutableString
, который имеет метод appendString
, устраняя некоторую необходимость в дополнительных временных строках.
Во-вторых, используйте NSArray
для конкатенации через метод componentsJoinedByString
.
Если у вас есть 2 NSString литералы, вы также можете просто сделать это:
NSString *joinedFromLiterals = @"ONE " @"MILLION " @"YEARS " @"DUNGEON!!!";
Что's также полезный для присоединения #определяет:
#define STRINGA @"Also, I don't know "
#define STRINGB @"where food comes from."
#define JOINED STRINGA STRINGB
Наслаждаться.
Я продолжаю возвращаться в этот пост и всегда перебирать ответы, чтобы найти это простое решение, которое работает со многими переменными по мере необходимости:
[NSString stringWithFormat:@"%@/%@/%@", three, two, one];
Например:
NSString *urlForHttpGet = [NSString stringWithFormat:@"http://example.com/login/username/%@/userid/%i", userName, userId];
Ну, а двоеточие-это вид специального символа, но является частью сигнатуры метода, можно exted в NSString
с категорией, чтобы добавить этот не-идиоматические** стиль конкатенации строк:
[@"This " : @"feels " : @"almost like " : @"concatenation with operators"];
Вы можете определить столько, отделяясь от него двоеточием аргументы, как вы найдете полезную... ;-)
Для хорошей мерой, я'ве также добавил, что функция concat:
с переменным числом аргументов, которая принимает "нулевые" прекращено списка строк.
// 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);
}
Создание метода:
- (NSString *)strCat: (NSString *)one: (NSString *)two
{
NSString *myString;
myString = [NSString stringWithFormat:@"%@%@", one , two];
return myString;
}
Затем, в какую бы функцию он нужен, задать строку или текстовое поле или что-то возвращаемое значение этой функции.
Или, чтобы сделать ярлык, преобразовать NSString в строку C++ и использовать '+' есть.
Использовать этот способ:
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."];
Макросъемка:
// 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:@""];
При построении запросов для веб-служб, я считаю, делать что-то вроде следующего-это очень легко и делает конкатенацию читаемым в 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>"
};
Ярлык путем создания AppendString (как) макро ...<БР> в <предварительно>
;Эта&qu NSString *mystring совсем = @то";
NSString *тест = а(например,@!" это просто тест на"); </пред>
Примечание:
При использовании макроса, конечно, просто делать это с аргументами переменной длины, см. EthanB'ы ответ.
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];
NSString *myString = @"This";
NSString *test = [myString stringByAppendingString:@" is just a test"];
Через пару лет с целью С Я думаю, что это лучший способ работы с целью С достижения того, чего вы пытаетесь достичь.
Начало ввода в "Н" в приложение Xcode и это autocompletes, чтобы я NSString " и;. ключ в "СПО" и это autocompletes, чтобы "stringByAppendingString на". Так что нажатие клавиш достаточно ограничены.
Как только вы получите повесить попадания в "@" по ключ и нашив процессе написания удобочитаемого кода больше не становится проблемой. Это всего лишь вопрос адаптации.
Как насчет укорочения `stringByAppendingString и использовать #определение:
#define and stringByAppendingString
Таким образом, вы использовали бы:
NSString* myString = [@"Hello " and @"world"];
Проблема в том, что он работает только для двух строк, вы'вновь необходимо обернуть дополнительные скобки для более добавляет:
NSString* myString = [[@"Hello" and: @" world"] and: @" again"];
Единственный способ сделать c = [a stringByAppendingString: b]
короче - это использовать автозаполнение примерно в точке st
. Оператор +
является частью языка C, который не знает об объектах Objective-C.
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];
Пробовал следующие в области символы отладки
[NSString stringWithFormat:@"%@/%@/%@", three, two, one];
какие ошибки.
вместо того, чтобы использовать метод alloc и initWithFormat
:
[[NSString alloc] initWithFormat:@"%@/%@/%@", @"three", @"two", @"one"];
Я попробовал этот код. это'ы работал для меня.
NSMutableString * myString=[[NSMutableString alloc]init];
myString=[myString stringByAppendingString:@"first value"];
myString=[myString stringByAppendingString:@"second string"];
NSNumber *lat = [NSNumber numberWithDouble:destinationMapView.camera.target.latitude];
NSNumber *lon = [NSNumber numberWithDouble:destinationMapView.camera.target.longitude];
NSString *DesconCatenated = [NSString stringWithFormat:@"%@|%@",lat,lon];