NSStrings සමපාත කිරීම සඳහා පරමාර්ථ-සී හි කෙටිමං


1134

( stringByAppendingString:) පරමාර්ථ-සී හි ( ) නූල් සම්මුතියට කෙටිමං තිබේද , නැතහොත් 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

45
IcNicolasMiari Objective-C හි නොමැති එකම ලක්ෂණය මෙය නොවේ. තවත් දුසිම් ගණනක් ඇත. ජෝර්ඩෝ විසින් පළ කරන ලද සබැඳියෙන් උපුටා දක්වමින් : "පරමාර්ථය-සී යනු නොපැහැදිලි, ප්‍රාථමික භාෂාවක්. එය ඕනෑම නවීන භාෂාවක් සමඟ සසඳන්න. මම එකඟයි. පරමාර්ථය-සී (1980 දශකයේ මුල් භාගය) යනු සී (1970 දශකයේ මුල් භාගය) වන අතර එය ඉතා සරල හා ඉතා ආරක්ෂිත නොවන ඕ.ඕ.පී. එය කමක් නැත, නමුත් ජාවා හෝ සී # සමඟ සසඳන විට, එය ඉතා පැරණි විලාසිතාවක් ලෙස දැනේ.
jcsahnwaldt මොනිකා නැවත ස්ථාපනය කරන්න

6
IcNicolasMiari: පරිවර්ථනය කළ භාෂාව? සී # සහ ජාවා සම්පාදනය කරන ලද භාෂා වේ. බයිට් කේතයට සම්පාදනය කරන ලද අතර එය නැවත යන්ත්‍ර කේතයට සම්පාදනය කෙරේ.
ජෝරන්

3
දැන් දේවල් වෙනස් කර ඇත: ස්විෆ්ට් (ඇපල් නව භාෂාව) වඩාත් සරල ය
ප්‍රදීප්

6
"වර්ගයේ ආරක්ෂාව" සම්බන්ධයෙන්, එය ශෛලියේ ගැටලුවක් යැයි මම සිතමි. C # / C ++ වලින් පැමිණෙන කෙනෙකුට, ඕනෑම වර්ගයක වස්තූන්ගේ විෂමජාතීය අරා තිබීම අමුතු බවක් පෙනෙන්නට තිබුණත්, පරමාර්ථ-සී / කොකෝවා වලට හුරුවී ඇති කෙනෙකුට එය ගතිකත්වය සහ නිදහසකි; එය ඔබ කරන්නේ කුමක්දැයි ඔබ දන්නා තරමට වාසියකි. සී ගැන සෑම දෙයක්ම මෙන් මේ දිනවල තරුණ ක්‍රමලේඛකයින් පහර දෙයි ...
නිකොලස් මාරි

Answers:


618

මට සිතිය හැකි පිළිතුරු දෙකක් ... සමෝධානික ක්‍රියාකරුවෙකු සිටීම තරම් ප්‍රසන්න නොවේ.

පළමුවෙන්ම, ක්‍රමයක් භාවිතා කරන NSMutableString, appendStringඅමතර තාවකාලික නූල් සඳහා අවශ්‍යතාවය ඉවත් කරන්න.

දෙවනුව, ක්‍රමවේදය NSArrayහරහා සමපාත වීමට an භාවිතා කරන්න componentsJoinedByString.


34
අනෙක් විකල්පයට බොහෝ ඉහළ නැංවීම් තිබුණද, ඉදිකිරීම් පිළිබඳ ඔබේ සියලු නූල් ඔබ නොදන්නේ නම් මෙය හොඳම පිළිතුර යැයි මම සිතමි. ඔබ නූලක් එකතු කරන සෑම අවස්ථාවකම, ඔබ ඉහළින් බොහෝ දේ නිර්මාණය කරයි. විකෘති නූල් භාවිතා කිරීමෙන් එම ගැටළුව ඉවත් වේ.
ඒලි

22
+1 එකඟ වන්න w @ එලී. මේවා සාමාන්‍යයෙන් හොඳම විසඳුම් වේ. NSArray -componentsJoinedByString එක පේළියකින් ඉතා හොඳින් කළ හැකිය: string = [[NSArray arrayWithObjects: This "මෙය", "Is", "A", "Test", nil] සංරචක JOinedByString: @ ""];
රොබ් නේපියර්

4
මෙම පිළිතුර සඳහා +1. [NSMutableString appendString]වඩා මතක හිතකාමී වේ [NSString stringByAppendingStrings].
පියරේ-ඩේවිඩ් බෙලෙන්ජර්

2
Ob රොබ්නැපියර්: දැන් නව අරා වචනාර්ථමය වාක්‍ය ඛණ්ඩය සමඟ එය වඩාත් හොඳය.
අමෝග් තල්පල්ලිකාර්

27
මෙම [NSString stringWithFormat:@"%@/%@/%@", three, two, one];තාක්ෂණය වඩාත් අලංකාර පෙනේ. එය තෝරාගත් පිළිතුර විය යුතුය.
ekillaby

1133

විකල්පයක්:

[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
ab පැබ්ලාසෝ එකඟ විය. යුටිල් ක්‍රමය තරමක් කැතයි. ඔබට එවැනි දෙයක් අවශ්‍ය නම්, එය + stringByAppendingStrings වැනි නමක් සහිත NSString කාණ්ඩයක් ලෙස කළ යුතුය. NSStringForAppendedStrings (...) වැනි නමක් සහිත සෘජු ශ්‍රිතයක් පවා උටිල් වැනි පන්තියක ස්ථිතික ක්‍රමයකට වඩා හොඳ වනු ඇත (නමේ “උටිල්” සමඟ ඇති ඕනෑම දෙයක් දුර්වල සාධක වේ). තාවකාලික ස්වයංක්‍රීයව මුදා හරින ලද එන්එස්එස්ට්‍රින්ග්ස් හි අසීමිත කට්ටලයක් නිර්මාණය කිරීමෙන් වළක්වා ගැනීම සඳහා එන්එස්මුටබල් ස්ට්‍රිං සහ -ඇපෙන්ඩ් ස්ට්‍රිං සමඟ ද මෙම ක්‍රියාව වඩා හොඳින් ක්‍රියාත්මක වේ.
රොබ් නේපියර්

1
විශාල නූල් වලින් මෙය මතකය නාස්ති කළ හැකිය. නිර්දේශිත වන්නේ සැබෑ ක්‍රමලේඛන භාෂාවල ඇති StringBuilder වැනි දෙයකි. එවිට ඔබ ඇත්ත වශයෙන්ම එකතු කිරීමට පටන් ගැනීමට පෙර කොපමණ මතකයක් අවශ්‍යදැයි ඔබට දැනගත හැකිය. මෙය සිදු කිරීම සඳහා ඉහත ප්‍රවේශය නැවත සකස් කළ හැකිය. කෙසේ වෙතත්, StringBuilder වස්තුවක් සෑදීම වඩා හොඳය, මෙය පරිශීලකයාට අවශ්‍ය සියලුම නූල් ලැයිස්තුවක් නිරීක්ෂණය කිරීමෙන් වළක්වා ගත හැකිය.
ජෝර්ජ්

ඔබ යූටිල් ආනයනය කරන්නේ කෙසේද? මෙම IDE කලකිරීමට පත්ව ඇත (සූර්යග්‍රහණයේ දී මෙන් "යමක් ආනයනය කිරීමට යෝජනා කර නැත." කිසිම තැනක "යුටිල්" ගැන සඳහනක් නොමැත. මෙය මා විසින්ම කේත කළ යුතු පන්තියක් ද?
ගුබට්‍රොන්

stringWithFormat ඉතා අලංකාර පමණක් නොව එය වඩාත් බලවත් ය. ඔබ එය නූල් දෙකක් සංයුක්ත කිරීම සඳහා% "% @% @" සමඟ භාවිතා කරයි, නූල් තුනක් සංයුක්ත කිරීම සඳහා% "% @% @% @", නමුත් ඔබට අමතර අක්ෂර ඇතුලත තැබිය හැකිය, මුද්‍රණ අංක, ඔබ කැමති නම් පරාමිති නැවත සකසන්න. . ආකෘති දාමය දේශීයකරණය කළ හැකි අතර එය දස ගුණයකින් බලවත් වේ. නූල් සම්මුතිය ආරම්භකයින් සඳහා වේ.
gnasher729

150

ඔබ 2 NSString නම් literals , ඔබ ද හුදෙක් මෙය කළ හැකි:

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ţă :) එහෙත් මෙම සමඟ පමණක් ක්රියා literals ගතිකව නිර්මාණය NSString අවස්ථා සමග නොවේ.
ජොහැන්නස් ෆැරන්ක්රුග්

9
@පළමු වැන්නෙන් පසු ඔබට ඇත්ත වශයෙන්ම නූල් මත s අවශ්‍ය නොවේ . @"I" " really" " enjoy"...
කෙවින්

ඔබට බොහෝ විට STRINGA සහ STRINGB වරහන් තුළට දැමීමට අවශ්‍ය විය යුතුය, එසේ නොමැතිනම් සාර්ව නිරාකරණය වූ විට ඔබට අමුතු ප්‍රති results ල ලැබෙනු ඇත. # JOINED (STRINGA STRINGB) නිර්වචනය කරන්න
digory doo

@ ජොහැන්නස් ෆැරන්ක්රුග් එසේ නම් මෙය NSString* const SQL_CREATE_TABLE_str = @"CREATE TABLE IF NOT EXISTS " TABLE_NAME @" (...);";ක්‍රියාත්මක නොවන්නේ ඇයි? මට Expected '@' in programදෝෂයක් තිබේ :(
Vagif

Ag වාගීෆ් TABLE_NAMEඅර්ථ දක්වන්නේ කෙසේද?
ජොහැන්නස් ෆැරන්ක්රුග්

75

මම දිගටම මෙම තනතුරට නැවත පැමිණෙන අතර අවශ්‍ය තරම් විචල්‍යයන් සමඟ ක්‍රියා කරන මෙම සරල විසඳුම සොයා ගැනීම සඳහා සෑම විටම පිළිතුරු හරහා වර්ග කිරීම අවසන් කරමි:

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

උදාහරණයක් වශයෙන්:

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

51

ක්රමයක් සාදන්න:

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

ඉන්පසුව, ඔබට අවශ්‍ය ඕනෑම ශ්‍රිතයකදී, ඔබේ නූල හෝ පෙළ ක්ෂේත්‍රය හෝ මෙම ශ්‍රිතයේ ප්‍රතිලාභ අගයට ඕනෑම දෙයක් සකසන්න.

නැතහොත්, කෙටිමඟක් සෑදීම සඳහා, එන්එස්එස්ට්‍රිං සී ++ නූලක් බවට පරිවර්තනය කර එහි '+' භාවිතා කරන්න.


45

හොඳයි, අන්ත්ර, විශේෂ සංකේතය ආකාරයේ, නමුත් වේ ක්රමය අත්සන කොටසක්, එය කළ හැකි ද exted කිරීමට NSStringමෙම එක් කිරීමට ප්රවර්ග සහිත -සෙන්දගශයෙහි නොවන string අකාර ශෛලිය:

[@"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
මම මීට වසරකට පෙර මෙය පහත් කොට සැලකුවේ එය එතරම් හොඳ පිළිතුරක් නොවන බැවිනි. පාලිමොන්ඩෝගේ ක්‍රියාවට නැංවීම සඳහා බොහෝ සමාන සමාන ක්‍රම විශාල ප්‍රමාණයක් ක්‍රියාත්මක කිරීම හෝ ක්‍රම කිහිප වතාවක්ම කැඳවීම අවශ්‍ය වේ. එහි ප්‍රති ing ලයක් වශයෙන් විශාල කේත කැබැල්ලක් අවශ්‍ය වේ. මෙම ප්‍රවේශය භාවිතා කිරීමෙන් ඔබට සරල දෙයකින් කිසිදු ප්‍රතිලාභයක් නොලැබේ stringWithFormat:. සම්මත නොවන පමණක් නොව ව්‍යාකූල වන නම් කරන ලද පරාමිතීන් නොමැතිකම ගැන සඳහන් නොකරමු.
FreeAsInBeer

2
මුල් අසන්නා සඳහන් කළ stringByAppendingStringඅතර ඔහු තර්ක දෙකකට වඩා භාවිතා කිරීම ගැන කිසිවක් කීවේ නැත. පිළිගත් පිළිතුරට වඩා මම මෙම පිළිතුරට කැමතියි. ඒක හරිම දක්ෂයි.
sudo

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

35
ඔබ යෝජනා කරන්නේ ඔහුට නොකිරීමට අවශ්‍ය දේම ඔබ යෝජනා කරන බව ඔබට වැටහෙනවා නේද?
SilverSideDown

31

මැක්‍රෝ:

// 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% ක් ව්‍යතිරේකයක් ලෙස සිතිය හැකිය. සමග 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>"
};

මෙම වාක්‍ය ඛණ්ඩය කරන්නේ කුමක්ද යන්න ඔබට පැහැදිලි කළ හැකිද? මෙය නූල් සමූහයක් නිර්මාණය කර කෙසේ හෝ ඒවාට සම්බන්ධ වන්නේද? ඕනෑම ලියකියවිලි සඳහා යොමු කිරීමක් ද සිසිල් වනු ඇත.
නෝමන් එච්

2
Or නෝමන් එච්: මෙය ඇත්ත වශයෙන්ම සී භාෂාවේ කොටසකි. ටිකක් කැණීම් පසු, මම සොයා ගැනීමට හැකි විය මෙම . එය "String concatenation" අවධිය යටතේ සඳහන් වේ: සියලුම යාබද නූල් සහ පුළුල් නූල් වචනාර්ථයන් සංයුක්ත වේ. නිදසුනක් ලෙස, "නූල්" "සමෝච්ඡය" "නූල් සම්මුතිය" බවට පත්වේ.
FreeAsInBeer

27

AppendString (AS) සාර්ව නිර්මාණය කිරීමෙන් කෙටිමඟ ...

# AS (A, B) [(A) stringByAppendingString: (B)] යන්න අර්ථ දක්වන්න
NSString * myString = @ "මෙය"; NSString * test = AS (myString, @ "යනු පරීක්ෂණයක් පමණි");

සටහන:

සාර්ව භාවිතා කරන්නේ නම්, ඇත්ත වශයෙන්ම එය විචල්‍ය තර්ක සමඟ කරන්න, ඊතන්බීගේ පිළිතුර බලන්න.


සිසිල්! මම තවමත් සිතන්නේ ඉහත උපයෝගීතාව වඩාත් අලංකාර විසඳුමක් බවයි; ඔබට මෙම සාර්ව සමඟ එක් නූලක් පමණක් එකතු කළ හැකිය, නේද?
typeoneerror

1
ඉහත AS මැක්‍රෝ කේත පේළියකට එක් කරයි. බහුවිධ උපග්‍රන්ථ පොදු අවශ්‍යතාවයක් නම්, තවත් මැක්‍රෝස් නිර්මාණය කළ හැකිය. උදාහරණයක් ලෙස, නූල් දෙකක් එකතු කිරීමට සාර්වයක්: <pre> # A2S (A, B, C) [[(A) stringByAppendingString: (B)] stringByAppendingString: (C)] </pre>

2
නැතහොත්, "# AS stringByAppendingString" වැනි මැක්‍රෝවකින් අවශ්‍ය යතුරු ලියනය කෙටි කරන්න, ඉන්පසු ඔබ සාමාන්‍යයෙන් "stringByAppendingString" ටයිප් කරන "AS" භාවිතා කරන්න, සහ කේත පේළියකට බහු එකතු කිරීම් භුක්ති විඳින්න.

15
මෙම මැක්‍රෝස් වල ඇති ගැටළුව නම් ඒවා කියවීමේ හැකියාව වන පරමාර්ථ-සී හි එක් ප්‍රධාන ඉලක්කයක් යටපත් කිරීමයි. "ඒඑස්" කරන්නේ කුමක්ද යන්න අතිශයින්ම අපැහැදිලි ය. යතුරු පැදීම් කිහිපයක් (ඒවායින් බොහොමයක් ස්වයංක්‍රීයව සම්පූර්ණ කිරීම සමඟ) කියවීමේ වියදමෙන් ඉතිරි කිරීම කලාතුරකින් හොඳ වෙළඳාමක් වේ. ව්යතිරේක පවතී (string "" සින්ටැක්ස් + stringWithUTF8String භාවිතා කිරීමට වඩා සෑම විටම කියවිය හැකි ය: සෑම අවස්ථාවකම), නමුත් ඉලක්කය හුදෙක් සංක්ෂිප්තතාවයට වඩා කියවීමේ හැකියාව විය යුතුය. ඔබ එක් වරක් ලියන නමුත් ඔබ සදහටම නිදොස් කරයි.
රොබ් නේපියර්

හායි රොබ් - මට මේ සම්බන්ධයෙන් ඔබ සමඟ එකඟ විය නොහැක. ෂුවර්, "ඒඑස්" නරක නමකි. එය සමහර විට "CAT" ලෙස නම් කළ යුතුය.
ෆැට්ටි

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

දැන් වසර කිහිපයකට පසු වෛෂයික සීඅයි සමඟ සිතන්න ඔබ සාක්ෂාත් කර ගැනීමට උත්සාහ කරන දේ සාක්ෂාත් කර ගැනීම සඳහා පරමාර්ථ සී සමඟ වැඩ කිරීමට හොඳම ක්‍රමය මෙයයි.

ඔබගේ Xcode යෙදුමේ "N" හි යතුරු කිරීම ආරම්භ කරන්න, එය "NSString" වෙත ස්වයංක්‍රීයව සම්පුර්ණ වේ. "str" ​​හි යතුර එය ස්වයංක්‍රීයව "stringByAppendingString" වෙත සම්පුර්ණ කරයි. එබැවින් යතුරු එබීම තරමක් සීමිතය.

ඔබ "@" යතුර එබීමෙන් පසු කියවිය හැකි කේත ලිවීමේ ක්‍රියාවලිය ටැබ් කිරීම තවදුරටත් ගැටලුවක් නොවේ. එය අනුවර්තනය වීමේ කාරණයක් පමණි.


ඔබ යෝජනා කරන්නේ ඔහුට නොකිරීමට අවශ්‍ය දේම ඔබ යෝජනා කරන බව ඔබට වැටහෙනවා නේද?
පරිශීලකයෙකු නොවන පරිශීලක

8

c = [a stringByAppendingString: b]ඕනෑම කෙටි කිරීමක් කළ හැකි එකම ක්‍රමය වන්නේ ස්වයං සම්පුර්ණ කිරීම stලක්ෂ්‍යය වටා භාවිතා කිරීමයි . මෙම +ක්රියාකරු අරමුණ සී වස්තූන් ගැන දන්නේ නොවන සී කොටසක් වේ.


ඔබ යෝජනා කරන්නේ ඔහුට නොකිරීමට අවශ්‍ය දේම ඔබ යෝජනා කරන බව ඔබට වැටහෙනවා නේද? අවම වශයෙන්, #defineඑය කෙටි කිරීමට a භාවිතා කළ හැකිය.
පරිශීලකයෙකු නොවන පරිශීලක

8

කෙටි කිරීම stringByAppendingStringසහ # අර්ථ දැක්වීම භාවිතා කරන්නේ කෙසේද :

#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

මෙය වඩා හොඳ ල ging ු-සටහන් සඳහා වන අතර, ලොග් වීම පමණි - dicius විශිෂ්ට බහු තර්ක ක්‍රමය මත පදනම්ව. මම ලොගර් පන්තියක් නිර්වචනය කර එය එසේ අමතන්න:

[Logger log: @"foobar ", @" asdads ", theString, 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://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 

කොන්ක්‍රීට් නූල් පමණක් කිරීම සඳහා , මම එන්එස්එස්ට්රිං හි කාණ්ඩයක් නිර්වචනය කර එයට ස්ථිතික (+) සංයුක්ත ක්‍රමයක් එක් කරමි, එය හරියටම ල log ු-සටහන් ක්‍රමය මෙන් පෙනේ. එය එන්එස්එස්ට්‍රිං හි ඇත්තේ එය නූල් ක්‍රමයක් නිසා වන අතර එය ස්ථිතික වන්නේ ඔබට 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

බොහෝ විට නූල් සමඟ ගනුදෙනු කරන විට ප්‍රභව ගොනුව ObjC ++ බවට පත් කිරීම මට පහසු වේ, එවිට මට ප්‍රශ්නයේ පෙන්වා ඇති දෙවන ක්‍රමය භාවිතා කරමින් 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;

28 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
listOfCatalogIDs =[@[@"id[]=",listOfCatalogIDs] componentsJoinedByString:@""];

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:@", "];
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.