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


1129

क्या stringByAppendingString:उद्देश्य-सी में या NSString(सामान्य रूप से काम करने के लिए शॉर्टकट) के लिए कोई शॉर्टकट हैं ?

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

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

कुछ और जैसे:

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

4
मैं सिर्फ '@ +' को कॉन्सेप्टेशन ऑपरेटर के रूप में प्रस्तावित करना चाहूंगा। मैं इसे अगले अपडेट में ऑब्जेक्टिव-सी, kthxbai
powerj1984

44
@ नाइकोलासमीरी यह एकमात्र ऐसी विशेषता नहीं है जिसमें उद्देश्य-सी का अभाव है। अन्य दर्जनों हैं। से हवाला देते हुए लिंक Jordão पोस्ट: "ऑब्जेक्टिव-सी है, कुंद, एक आदिम भाषा होने के लिए यह किसी भी आधुनिक भाषा के लिए की तुलना करें और आप जल्दी से यह कमी पाते हैं।।" मैं सहमत हूँ। ऑब्जेक्टिव-सी (1980 के दशक की शुरुआत) सी (शुरुआती 1970 के दशक) एक बहुत ही सरल और बहुत ही सुरक्षित प्रकार का ओओपी नहीं है। यह ठीक है, लेकिन जावा या सी # की तुलना में, यह बहुत पुराने जमाने का लगता है।
jcsahnwaldt का कहना है कि GoFundMonica

5
@ नीकोलमीरी: व्याख्या की गई भाषा? C # और Java संकलित भाषाएं हैं। बाइटकोड के लिए संकलित, जिसे फिर मशीन कोड में फिर से संकलित किया गया है।
जॉरेन

3
अब चीजें बदल गई हैं: स्विफ्ट (सेब की नई भाषा) अधिक सीधी है
प्रदीप

6
"प्रकार सुरक्षा" के बारे में, मुझे लगता है कि यह शैली की समस्या है। C # / C ++ से आने वाले किसी व्यक्ति के लिए, किसी भी प्रकार की वस्तुओं के विषम सरणियों का होना अजीब लग सकता है, लेकिन किसी व्यक्ति के लिए Objective-C / Coco का आदी होना, यह गतिशीलता और स्वतंत्रता का एक रूप है; यह एक फायदा है जो आपको पता है कि आप क्या कर रहे हैं। C के बारे में सब कुछ बहुत पसंद है कि युवा प्रोग्रामर इन दिनों
मारपीट करते हैं

जवाबों:


616

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

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

दूसरा, विधि के NSArrayमाध्यम से एक समवर्ती का componentsJoinedByStringउपयोग करें।


34
यद्यपि अन्य विकल्प में कई उतार-चढ़ाव हैं, मुझे लगता है कि यह सबसे अच्छा उत्तर है यदि आप निर्माण पर अपने सभी तार नहीं जानते हैं। हर बार जब आप एक स्ट्रिंग जोड़ते हैं, तो आप बहुत अधिक ओवरहेड बना रहे हैं। एक उत्परिवर्ती स्ट्रिंग का उपयोग करके उस समस्या को दूर किया जाता है।
एली

22
+1 सहमत w @ ईली। ये आम तौर पर सबसे अच्छा समाधान हैं। NSArray -compordsJoinedByString एक ही लाइन में बहुत अच्छी तरह से किया जा सकता है: string = [[NSArray arrayWithObjects: @ "This", "Is", "A", "Test", nil] ComponentsJoinedByString: @ ""];
रोब नेपियर

4
इस उत्तर के लिए +1। [NSMutableString appendString]की तुलना में अधिक मैत्रीपूर्ण है [NSString stringByAppendingStrings]
पियरे-डेविड बेलांगर

2
@RobNapier: अब नए ऐरे शाब्दिक वाक्य-विन्यास के साथ, यह और भी बेहतर है।
अमोघ तलपल्लिकर

27
[NSString stringWithFormat:@"%@/%@/%@", three, two, one];तकनीक सबसे खूबसूरत लगता है। यह चयनित उत्तर होना चाहिए।
एकिलाबाई

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
@ पबलशो सहमत। Util तरीका बहुत बदसूरत है। यदि आप ऐसा चाहते थे, तो इसे NSString श्रेणी के रूप में किया जाना चाहिए जैसे + stringByAppendingStrings:। यहां तक ​​कि NSStringForAppendedStrings (...) जैसे नाम के साथ एक सीधा-सीधा कार्य भी कक्षा में एक स्थिर विधि से बेहतर होगा जैसे कि Util (नाम में "Util" के साथ कुछ भी खराब रूप से तथ्यहीन है)। समारोह भी एक NSMutableString और -appendString के साथ बेहतर ढंग से कार्यान्वित किया जाता है ताकि अस्थायी ऑटोरेल्ड एनएसएसट्रेस के एक अनबाउंड सेट बनाने से बचें।
रोब नेपियर

1
बड़े तार के साथ यह स्मृति को बर्बाद कर सकता है। अनुशंसित वास्तविक प्रोग्रामिंग भाषाओं में स्ट्रिंगबर्ल की तरह कुछ और है। तब आप केवल यह पता लगा सकते हैं कि वास्तव में आपको याद रखना शुरू करने से पहले कितनी मेमोरी की आवश्यकता है। उपरोक्त दृष्टिकोण को ऐसा करने के लिए फिर से शुरू किया जा सकता है। हालांकि, एक स्ट्रिंगबुलस्ट ऑब्जेक्ट बनाना बेहतर होगा क्योंकि यह इसके उपयोगकर्ता को उन सभी तारों की सूची का ट्रैक रखने से बचाएगा, जिन्हें उन्हें संयुक्त करने की आवश्यकता है।
जॉर्ज

आप Util को कैसे आयात करते हैं? यह आईडीई निराशाजनक है (कोई सुझाया गया "कुछ आयात नहीं करें।
यूटील

stringWithFormat न केवल बहुत सुरुचिपूर्ण है, यह बहुत अधिक शक्तिशाली भी है। आप इसे दो स्ट्रिंग्स को बदलने के लिए @ "% @% @" के साथ उपयोग करते हैं, तीन स्ट्रिंग्स को समेटने के लिए @ "% @% @% @", लेकिन अगर आप पसंद करते हैं, तो आप किसी भी अतिरिक्त वर्णों को अंदर, प्रिंट संख्या, पुन: क्रम पैरामीटर डाल सकते हैं। । प्रारूप स्ट्रिंग को स्थानीयकृत किया जा सकता है, जिससे यह दस गुना अधिक शक्तिशाली हो जाता है। स्ट्रिंग कॉन्टिनैशन शुरुआती लोगों के लिए है।
gnasher729

150

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

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

यह # योगों में शामिल होने के लिए भी उपयोगी है:

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

का आनंद लें।


13
@ CristiBăluţă :) लेकिन इस के साथ ही काम करता है शाब्दिक डायनामिक रूप से तैयार NSString उदाहरणों के साथ नहीं।
जोहान्स फारेनक्रग

9
आप वास्तव @में पहली के बाद तार पर एस की जरूरत नहीं है । @"I" " really" " enjoy"...
केविन

आपको संभवतः STRINGA और STRINGB को कोष्ठक के भीतर रखना चाहिए, अन्यथा मैक्रो हल होने पर आपको अजीब परिणाम मिल सकते हैं। # डिफाइन जॉयड (STRINGA STRINGB)
डिगोरी डू

@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

खैर, जैसा कि बृहदान्त्र विशेष प्रतीक का एक प्रकार है, लेकिन विधि हस्ताक्षर का हिस्सा है, यह स्ट्रिंग संयोजन की 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
मैंने इसे एक साल पहले रद्द कर दिया था क्योंकि यह बहुत अच्छा जवाब नहीं है। बड़ी संख्या में तारों को समेटने से निपटने के लिए, पालीमोंडो के कार्यान्वयन के लिए या तो बहुत ही समान दिखने वाले तरीकों की एक बड़ी संख्या को लागू करने की आवश्यकता होती है, या कई बार विधियों को कॉल करना पड़ता है, जिसके परिणामस्वरूप कोड का एक बड़ा हिस्सा होता है जो अनिवार्य रूप से तार को समेटता है। इस दृष्टिकोण का उपयोग करते हुए, आपको एक साधारण लाभ नहीं मिलता है 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
आपको एहसास होता है कि आप सही बात का सुझाव दे रहे हैं जो वह नहीं करना चाहता था , है ना?
सिल्वरसाइडडाउन 14

इतना रिसाव!
रामग्राम

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
थोड़ी देर में इस प्रश्न की जाँच नहीं की गई, लेकिन मैं इन सभी वर्षों के बाद इसे सही उत्तर के रूप में स्वीकार करने की ओर झुक रहा हूँ!
टाइपोनियरर

1
यह भी यकीनन -[NSString stringByAppendingString:]इस उपयोग के मामले की तुलना में बेहतर व्यवहार है - पूर्व के साथ आपको एक अपवाद मिलेगा यदि तर्क है nilलेकिन यदि रिसीवर नहीं है। तो यह आपके स्ट्रिंग फीडर में एक गलती पर 50% बाधाओं को चुपचाप विफल कर रहा है और एक अपवाद पर 50% है। साथ stringConcatआप किसी पर एक अपवाद की गारंटी कर रहे हैं nil, सूची में कहीं भी। जो कम से कम अधिक अनुमानित है।
टॉमी

27

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

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
@ नोर्मन: यह वास्तव में सी भाषा का हिस्सा है। थोड़ी खुदाई के बाद, मुझे यह पता चला । यह "स्ट्रिंग संगति" चरण के तहत बताता है: सभी आसन्न स्ट्रिंग और चौड़े-स्ट्रिंग शाब्दिक रूप से समवर्ती होते हैं। उदाहरण के लिए, "स्ट्रिंग" "कंक्रीटिंग" "स्ट्रिंग कॉन्फैनेटेशन" बन जाता है।
FreeAsInBeer

27

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

#define AS (A, B) [(A) stringByAppendingString: (B)]
NSString * myString = @ "यह"; NSString * परीक्षण = AS (myString, @ "सिर्फ एक परीक्षण है");

ध्यान दें:

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


ठंडा! मुझे अभी भी लगता है कि ऊपर दिया गया यूटिलिटी बहुत अधिक सुरुचिपूर्ण समाधान है; आप इस मैक्रो के साथ केवल एक स्ट्रिंग जोड़ सकते हैं, है ना?
टाइपोनियरोर

1
सही है, ऊपर दिया गया मैक्रो कोड की प्रति पंक्ति एक परिशिष्ट करता है। यदि कई एपेंड एक सामान्य आवश्यकता हैं, तो अधिक मैक्रो बनाया जा सकता है। उदाहरण के लिए, दो स्ट्रिंग्स को जोड़ने के लिए एक मैक्रो: <pre> #define A2S (A, B, C) [[(A) stringByAppendingString: (B)] stringByAppendingString: (C) </ pre>

2
या, बस "#define AS stringByAppendingString" जैसे मैक्रो के साथ आवश्यक टाइपिंग को छोटा करें, फिर बस "AS" का उपयोग करें जहां आपका सामान्य रूप से "stringByAppendingString" टाइप होगा, और कोड की प्रति पंक्ति में कई एपेंड का आनंद लेंगे।

15
इन मैक्रो के साथ समस्या यह है कि वे ऑब्जेक्टिव-सी के प्रमुख लक्ष्यों में से एक को कमजोर कर देते हैं, जो पठनीयता है। यह बहुत अस्पष्ट है कि "एएस" क्या करता है। पठनीयता की कीमत पर कुछ कीस्ट्रोक्स (जिनमें से अधिकांश को स्वत: पूर्णता के साथ नियंत्रित किया जाता है) को सहेजना शायद ही कभी एक अच्छा व्यापार बंद होता है। अपवाद हैं (@ "" वाक्यविन्यास का उपयोग करने की तुलना में बहुत अधिक पठनीय है + stringWithUTF8String: हर बार), लेकिन लक्ष्य अभी भी केवल संक्षिप्तता के बजाय पठनीयता होना चाहिए। आप एक बार लिखते हैं, लेकिन आप हमेशा के लिए डिबग करते हैं।
रोब नेपियर

हाय रोब - मैं इसमें आपसे सहमत नहीं हो सकता। ज़रूर, "एएस" एक बुरा नाम है। इसे शायद "कैट" नाम दिया जाना चाहिए।
फेटी

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

ऑब्जेक्टिव CI के साथ अब कुछ वर्षों के बाद, आप जो हासिल करने की कोशिश कर रहे हैं, उसे प्राप्त करने के लिए Objective C के साथ काम करने का यह सबसे अच्छा तरीका है।

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

एक बार जब आपको "@" कुंजी मारने और पढ़ने योग्य कोड लिखने की प्रक्रिया को बंद कर दिया जाता है, तो यह समस्या नहीं बन जाती। यह सिर्फ आदत डालने की बात है।


आपको एहसास होता है कि आप सही बात का सुझाव दे रहे हैं जो वह नहीं करना चाहता था , है ना?
उपयोगकर्ता जो

8

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


आपको एहसास होता है कि आप सही बात का सुझाव दे रहे हैं जो वह नहीं करना चाहता था , है ना? बहुत कम से कम, #defineइसे छोटा करने के लिए इस्तेमाल किया जा सकता है।
उपयोगकर्ता जो

8

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

#define and stringByAppendingString

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

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

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

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

XCode7 आपको अब इस विकल्प का उपयोग नहीं करने देगा - कहते हैं "और" एक आरक्षित शब्द है। हालांकि, आप "बिल्ली" का उपयोग कर सकते हैं, बजाय कॉनकैनेटेशन के लिए। मैंने किया और आपका समाधान पूरी तरह से काम करता है और बेहद सरल है।
Volomike


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

कौन सी त्रुटी।

इसके बजाय आवंटन और initWithFormatविधि का उपयोग करें :

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

1
... काश मेरे पास टिप्पणी करने के लिए पर्याप्त प्रतिष्ठा होती लेकिन आशा है कि यह किसी और की मदद करता।
एंथनी डी सूजा

4

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

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

लगभग अच्छा है, "nil" के साथ var आर्ग को समाप्त करने के अलावा, लेकिन मुझे लगता है कि ऑब्जेक्टिव-सी में इसके आसपास कोई रास्ता नहीं है।

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://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-एन स्ट्रिंग्स से एक नया स्ट्रिंग बनाना चाहते हैं, इसे किसी भी एक स्ट्रिंग पर कॉल न करें जो एपेंड का हिस्सा हैं।


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

जब तार के साथ काम करते हुए अक्सर मुझे स्रोत फ़ाइल ओब्जेक ++ बनाना आसान लगता है, तो मैं प्रश्न में दिखाए गए दूसरे तरीके का उपयोग करके std :: strings को संक्षिप्त कर सकता हूं।

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

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

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


इसे कैसे बनाया जाए? जैसे: sTest3 = sTest1 + sTest2;

@ user285594 यह प्रश्न का बिंदु था: उद्देश्य-सी में वाक्यविन्यास की अनुमति नहीं है। अन्य उत्तर देखें।
उपयोगकर्ता जो

1

UI- टेस्ट में इसकी आवश्यकता वाले सभी उद्देश्य 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 Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.