objective c - NSStrings को संयोजित करने के लिए उद्देश्य-सी में शॉर्टकट्स




objective-c string-concatenation (20)

क्या उद्देश्य-सी में स्ट्रिंग stringByAppendingString: (स्ट्रिंगबैपेंडिंगस्ट्रिंग stringByAppendingString: में शॉर्टकट हैं या सामान्य रूप से stringByAppendingString: साथ काम करने के लिए शॉर्टकट हैं?

उदाहरण के लिए, मैं बनाना चाहता हूं:

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];

एक अन्य विकल्प:

मुझे लगता है कि आप कई एपेंड (ए + बी + सी + डी) से खुश नहीं हैं, इस मामले में आप कर सकते हैं:

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;
}

AppendString (एएस) मैक्रो बनाकर शॉर्टकट ...

#define AS(A,B)    [(A) stringByAppendingString:(B)]
NSString *myString = @"This"; NSString *test = AS(myString,@" is just a test");

ध्यान दें:

यदि मैक्रो का उपयोग करना है, तो निश्चित रूप से इसे विविध तर्कों के साथ करें, एथन बी का जवाब देखें।


आप एनएसएआरएआरई का उपयोग कर सकते हैं

NSString *[email protected]"This"

NSString *[email protected]"is just"

NSString *[email protected]"a test"  

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

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

या

आप उपयोग कर सकते हैं

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

इस तरह प्रयोग करें:

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."];

खैर, क्योंकि कोलन विशेष प्रतीक है, लेकिन विधि हस्ताक्षर का हिस्सा है, स्ट्रिंग कॉन्सटेनेशन की इस गैर-मूर्खतापूर्ण शैली को जोड़ने के लिए एनएसएसटींग को श्रेणी के साथ विस्तारित करना संभव है:

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

आप उपयोगी पाते हुए कई कॉलन अलग तर्कों को परिभाषित कर सकते हैं ... ;-)

एक अच्छे उपाय के लिए, मैंने concat: भी जोड़ा है 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);
}

जब मैंने परीक्षण किया तो इनमें से कोई भी प्रारूप XCode7 में काम करता है:

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

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

किसी कारण से, आपको मिश्रण की पहली स्ट्रिंग पर केवल @ ऑपरेटर चरित्र की आवश्यकता होती है।

हालांकि, यह परिवर्तनीय सम्मिलन के साथ काम नहीं करता है। इसके लिए, आप इस बेहद सरल समाधान का उपयोग "और" के बजाय "बिल्ली" पर मैक्रो का उपयोग करने के अपवाद के साथ कर सकते हैं।


दो उत्तरों के बारे में मैं सोच सकता हूं ... न तो विशेष रूप से एक संयोजक ऑपरेटर के रूप में सुखद है।

सबसे पहले, एक appendString उपयोग करें, जिसमें एक appendString विधि है, अतिरिक्त अस्थायी तारों की आवश्यकता को हटा दें।

दूसरा, componentsJoinedByString JoinedByString विधि के माध्यम से concatenate करने के लिए एक NSArray का उपयोग करें।


नए सरणी शाब्दिक वाक्यविन्यास का उपयोग करके, यहां एक आसान तरीका है:

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

मैं इस पोस्ट पर लौटता रहता हूं और हमेशा इस सरल समाधान को खोजने के लिए उत्तरों के माध्यम से छंटनी करता हूं जो आवश्यकतानुसार कई चर के साथ काम करता है:

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

उदाहरण के लिए:

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

मैंने इस कोड की कोशिश की। यह मेरे लिए काम किया है।

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

यह बेहतर लॉगिंग के लिए है, और केवल लॉगिंग - डिकियस उत्कृष्ट एकाधिक तर्क विधि के आधार पर। मैं लॉगर क्लास को परिभाषित करता हूं, और इसे इस तरह कहते हैं:

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

"Nil" के साथ var args को समाप्त करने के अलावा, लगभग अच्छा है, लेकिन मुझे लगता है कि उद्देश्य-सी में इसके आसपास कोई रास्ता नहीं है।

Logger.h

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

Logger.m

@implementation Logger

+ (void) log: (id) first, ...
{
    // TODO: make efficient; handle arguments other than strings
    // thanks to @diciu http://.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 

केवल कॉन्सट स्ट्रिंग्स के लिए, मैं एनएसएसटींग पर एक श्रेणी परिभाषित करता हूं और इसके लिए स्थिर (+) कॉन्सटेनेट विधि जोड़ता हूं जो उपरोक्त लॉग विधि की तरह दिखता है सिवाय इसके कि यह स्ट्रिंग देता है। यह एनएसएसटींग पर है क्योंकि यह एक स्ट्रिंग विधि है, और यह स्थिर है क्योंकि आप 1-एन तारों से एक नई स्ट्रिंग बनाना चाहते हैं, इसे किसी भी स्ट्रिंग पर कॉल न करें जो संलग्न करने का हिस्सा है।


वेब सेवाओं के लिए अनुरोधों का निर्माण करते समय, मुझे लगता है कि कुछ ऐसा करना बहुत आसान है और एक्सकोड में संगतता को पढ़ने योग्य बनाता है:

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>"
};

स्ट्रिंग WithFormat आज़माएं:

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

c = [a stringByAppendingString: b] बनाने का एकमात्र तरीका किसी भी छोटे बिंदु के चारों ओर स्वत: पूर्ण का उपयोग करना है। + ऑपरेटर सी का हिस्सा है, जो उद्देश्य-सी वस्तुओं के बारे में नहीं जानता है।


stringByAppendingString छोटा करने के बारे में और #define का उपयोग करें:

#define and stringByAppendingString

इस प्रकार आप इसका उपयोग करेंगे:

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

समस्या यह है कि यह केवल दो तारों के लिए काम करता है, आपको अधिक संलग्नकों के लिए अतिरिक्त ब्रैकेट लपेटने की आवश्यकता होती है:

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

मैक्रो:

// 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:@""];

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

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"];

उद्देश्य सीआई के साथ अब कुछ सालों के बाद सोचें कि आप जो हासिल करने की कोशिश कर रहे हैं उसे प्राप्त करने के लिए उद्देश्य सी के साथ काम करने का यह सबसे अच्छा तरीका है।

अपने एक्सकोड एप्लिकेशन में "एन" में कुंजी बनाना शुरू करें और यह "एनएसएसटींग" को स्वत: पूर्ण करता है। "str" ​​में कुंजी और यह "stringByAppendingString" को स्वत: पूर्ण करता है। तो कीस्ट्रोक काफी सीमित हैं।

एक बार जब आप "@" कुंजी को मारने और पठनीय कोड लिखने की प्रक्रिया को टैब्स करने के बाद एक समस्या बन जाती है। यह सिर्फ अनुकूलन का मामला है।


NSString *result=[NSString stringWithFormat:@"%@ %@", @"Hello", @"World"];




string-concatenation