এনএসএসআরটিংসকে সম্মতি জানাতে উদ্দেশ্য-সিতে শর্টকাটগুলি


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
আমি ঠিক একটি কনটেস্টেশন অপারেটর হিসাবে '@ +' প্রস্তাব দিতে চাই। আমি পরের আপডেটে এটি প্রত্যাশিত হব অবজেক্টিভ-সি,
কাঁথক্সবাই

44
@ নিকোলাসমিয়ারি এটি উদ্দেশ্যমূলক-সি এর একমাত্র বৈশিষ্ট্য নয়। আরও কয়েক ডজন আছে। জর্দো পোস্ট করা লিংকটি থেকে উদ্ধৃত করে : "উদ্দেশ্য-সি হ'ল আদিম ভাষা, অস্পষ্ট হতে হবে। এটি যে কোনও আধুনিক ভাষার সাথে তুলনা করুন এবং আপনি এটির দ্রুত অভাব দেখতে পান।" আমি রাজী. অবজেক্টিভ সি (1980 এর দশকের গোড়ার দিকে) সি (1970 এর দশকের গোড়ার দিকে) খুব সাধারণ এবং খুব টাইপ-নিরাপদ ধরণের ওওপি সংযোজন সহ। এটি ঠিক আছে তবে জাভা বা সি # এর সাথে তুলনা করলে এটি খুব পুরানো feels
জ্যাকসাহ্নওয়াল্ড্ট GoFundMonica

5
@ নিকোলাসমিয়ারি: ব্যাখ্যা করা ভাষা? সি # এবং জাভা সংকলিত ভাষা। বাইটকোডে সংকলিত, যা আবার মেশিন কোডে সংকলিত হয়।
জোরেেন

3
বিষয়গুলি এখন পরিবর্তিত হয়েছে: সুইফ্ট (অ্যাপল নতুন ভাষা) আরও সোজা
প্রদীপ

6
"প্রকার সুরক্ষা" সম্পর্কে, আমি মনে করি এটি শৈলীর একটি সমস্যা। সি # / সি ++ থেকে আসা যে কোনও ব্যক্তির পক্ষে, যেকোন প্রকারের বস্তুর ভিন্নধর্মী অ্যারে থাকা বেআইনি মনে হতে পারে তবে উদ্দেশ্যমূলক-সি / কোকোতে অভ্যস্ত কারও পক্ষে এটি গতিশীলতা এবং স্বাধীনতার এক রূপ; আপনি কী করছেন তা আপনি যদি জেনে থাকেন তবে এটি একটি সুবিধা। যুবা প্রোগ্রামাররা এই দিনগুলিকে
বাশিত

উত্তর:


616

দুটি উত্তর যা আমি ভাবতে পারি ... দু'টিও বিশেষত কেবল একটি সংক্ষিপ্ত অপারেটর থাকার মতো আনন্দদায়ক নয়।

প্রথমে একটি ব্যবহার করুন NSMutableString, যার একটি appendStringপদ্ধতি রয়েছে অতিরিক্ত টেম্প স্ট্রিংয়ের প্রয়োজনীয়তা সরিয়ে কিছু।

দ্বিতীয়ত, পদ্ধতির NSArrayমাধ্যমে সংযুক্ত করতে একটি ব্যবহার করুন componentsJoinedByString


34
যদিও অন্য বিকল্পটির অনেকগুলি আপোভেট রয়েছে, তবে আমি মনে করি এটি যদি আপনি নির্মাণের উপরের সমস্ত স্ট্রিংগুলি না জানেন তবে এটিই সেরা উত্তর। আপনি যখনই কোনও স্ট্রিং সংযোজন করবেন তখন আপনি প্রচুর ওভারহেড তৈরি করছেন। পরিবর্তনীয় স্ট্রিং ব্যবহার করা সেই সমস্যাটিকে সরিয়ে দেয়।
এলি

22
+1 ডাব্লু @ এলি সম্মত হন এগুলি সাধারণত সেরা সমাধান are এনএসআরএ-কম্পোনেন্টস জোয়েনড বাই স্ট্রিং খুব ভালভাবে একটি লাইনে করা যায়: স্ট্রিং = [[এনএসআর অ্যারে উইথঅবজেক্টস: @ "এটি", "ইস", "এ", "টেস্ট", নীল] উপাদানগুলি জয়ডবিস্ট্রিং: @ ""];
রব নেপিয়ার

4
এই উত্তরের জন্য +1। [NSMutableString appendString]তুলনায় আরও স্মৃতি বান্ধব [NSString stringByAppendingStrings]
পিয়েরে ডেভিড বেলঞ্জার

2
@ রবনাপিয়ার: এখন নতুন অ্যারে আক্ষরিক বাক্য গঠন সহ এটি আরও ভাল।
আমোগ তালপলিকর

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
@ পাব্লাসো একমত ইউটিল পদ্ধতিটি বেশ কুৎসিত। যদি আপনি এই জাতীয় জিনিসটি চান, এটি এনএসএসস্ট্রিং বিভাগ হিসাবে + স্ট্রিংবাই অ্যাপেন্ডিংস্ট্রিংস: এর মতো নামের সাথে করা উচিত। এমনকি এনএসএসটিরিং ফরএপেন্ডেন্ডস্ট্রিংস (...) এর মতো নামের একটি স্ট্রেট-আপ ফাংশন যেমন ইউটিলের মতো শ্রেণিতে স্থির পদ্ধতির চেয়ে ভাল হবে (নামের সাথে "উটিল" সম্বলিত কিছুটি সম্ভবত খারাপভাবে পরিসংখ্যানযুক্ত)। অস্থায়ী স্বতঃস্ফূর্ত এনএসএসআরটিংয়ের একটি সীমাহীন সেট তৈরি এড়াতে একটি এনএসমিটেবল স্ট্রিং এবং -অ্যাপেন্ডস্ট্রিংয়ের সাথেও ফাংশনটি আরও ভালভাবে প্রয়োগ করা হয়েছে।
রব নেপিয়ার

1
বড় স্ট্রিং সহ এটি স্মৃতি নষ্ট করতে পারে। বাস্তব প্রোগ্রামিং ভাষায় স্ট্রিংবিল্ডারের মতো আরও কিছু প্রস্তাবিত। তারপরে আপনি ঠিক কী পরিমাণ মেমোরি প্রয়োজন তা ঠিক আগে যুক্ত করা শুরু করার আগেই আপনি ঠিক করতে পারেন। উপরোক্ত পদ্ধতির এটি করতে রিফেক্টর করা যেতে পারে। তবে স্ট্রিংবিল্ডার অবজেক্টটি তৈরি করা আরও ভাল হবে কারণ এটির ব্যবহারকারীর পক্ষে তারা যে সমস্ত স্ট্রিংয়ের সংমিশ্রণ প্রয়োজন তার তালিকাকে রাখার হাত থেকে রক্ষা করবে।
জর্জ

আপনি কীভাবে ইউটিল আমদানি করবেন? এই আইডিই হতাশাজনক (গ্রহনের মতো কোনও "আমদানি করার প্রস্তাব দেওয়া হয়নি" এবং "কোথাও" উটিল "এর কোনও উল্লেখ পাই না this এই যে ক্লাসটি আমি নিজেই
কোডিং

স্ট্রিংউইথফর্ম্যাটটি কেবল খুব মার্জিত নয়, এটি আরও বেশি শক্তিশালী। আপনি এটি দুটি "স্ট্রিং সংশ্লেষ করার জন্য @"% @% @ "দিয়ে ব্যবহার করেছেন, @"% @% @% @ "তিনটি স্ট্রিং সংমিশ্রিত করতে, তবে আপনি কোনও অতিরিক্ত অক্ষর ভিতরে রেখে দিতে পারেন, মুদ্রণ সংখ্যাগুলি, পছন্দ করতে পারলে প্যারামিটারগুলি পুনরায় অর্ডার করতে পারেন ইত্যাদি। । বিন্যাসের স্ট্রিংটি স্থানীয় করা যেতে পারে, এটি দশগুণ বেশি শক্তিশালী করে তোলে। স্ট্রিং কনটেনটেশন নতুনদের জন্য।
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)
ডিগ্রি ডু

পুনঃটুইট জোহনেসফাহরেনক্রুগ তাহলে কেন এটি NSString* const SQL_CREATE_TABLE_str = @"CREATE TABLE IF NOT EXISTS " TABLE_NAME @" (...);";কাজ করে না? আমার Expected '@' in programত্রুটি হচ্ছে :(
ভগিফ

@ ভগিফ কীভাবে 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;
}

তারপরে, আপনার যে ফাংশনে এটি প্রয়োজন তা আপনার স্ট্রিং বা পাঠ্য ক্ষেত্র বা এই ফাংশনের রিটার্ন মান হিসাবে যা কিছু সেট করুন।

অথবা, একটি শর্টকাট তৈরি করতে, এনএসএসআর্টিং কে সি ++ স্ট্রিংয়ে রূপান্তর করুন এবং সেখানে '+' ব্যবহার করুন।


এটি সর্বাধিক সহজ সমাধান।
জেনকোড

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:। নামযুক্ত পরামিতিগুলির অভাব উল্লেখ না করা যা কেবল অ-মানকই নয়, বিভ্রান্তিকরও।
ফ্রিএএসআইনবিয়ার

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

34
আপনি বুঝতে পারি যে আপনি সঠিক জিনিস তিনি চেয়েছিলেন পরামর্শ করছি না না করতে হবে, ঠিক আছে?
সিলভারসাইটডাউন

এত ফাঁস!
রামগ্রাগ

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

একটি উদ্দেশ্য-সি নুব জন্য আপনি ব্যাখ্যা করতে পারেন যে এই বাক্য গঠনটি কী করছে? এটি কি স্ট্রিংগুলির একটি অ্যারে তৈরি করছে এবং তাদের সাথে কোনওভাবে যোগ দিচ্ছে? যে কোনও ডক্সের একটি রেফারেন্সও দুর্দান্ত।
নরম্যান এইচ

2
@ নরম্যানএইচ: এটি আসলে সি ভাষার অংশ। একটু খনক পর, আমি খুঁজে পেতে সক্ষম ছিল এই । এটি "স্ট্রিং কনটেনটেশন" পর্বের অধীনে উল্লেখ করেছে: সমস্ত সংলগ্ন স্ট্রিং এবং প্রশস্ত স্ট্রিং লিটারেলগুলি সংযুক্ত করা হয়। উদাহরণস্বরূপ, "স্ট্রিং" "কনট্যাকটেশন" "স্ট্রিং কনকেন্টেশন" হয়ে যায়।
ফ্রিএএসআইনবিয়ার

27

অ্যাপেন্ডস্ট্রিং (এএস) ম্যাক্রো তৈরি করে শর্টকাট ...

# নির্ধারিত এএস (এ, বি) [(ক) স্ট্রিংবাই অ্যাপেন্ডিং স্ট্রিং: (খ)]
এনএসএসস্ট্রিং * মাইস্ট্রিং = @ "এটি"; এনএসএসস্ট্রিং * পরীক্ষা = এএস (মাইস্ট্রিং, @ "কেবল একটি পরীক্ষা");

বিঃদ্রঃ:

যদি কোনও ম্যাক্রো ব্যবহার করে থাকেন তবে অবশ্যই এটি বৈচিত্রপূর্ণ যুক্তি দিয়েই করুন, ইথানবির উত্তর দেখুন।


শান্ত! আমি এখনও মনে করি উপরের ইউটিলটি অনেক বেশি মার্জিত সমাধান; আপনি এই ম্যাক্রোর সাথে একটি মাত্র স্ট্রিং যুক্ত করতে পারবেন, তাই না?
টাইপোনিয়ারর

1
সত্য, উপরের AS ম্যাক্রো কোডের লাইন প্রতি একটি সংযোজন করে। যদি একাধিক সংযোজনগুলি সাধারণ প্রয়োজন হয় তবে আরও ম্যাক্রোগুলি তৈরি করা যায়। উদাহরণস্বরূপ, দুটি স্ট্রিং সংযোজন করার জন্য একটি ম্যাক্রো: <pre> #Difine A2S (A, B, C) [[(A) স্ট্রিংবাই অ্যাপেন্ডিংস্ট্রিং: (B)] স্ট্রিংবাইপেন্ডিংস্ট্রিং: (সি)] </ p>

2
অথবা, "# ডেফাইন এএস স্ট্রিংবাই অ্যাপেন্ডিং স্ট্রিং" এর মতো ম্যাক্রোর সাথে প্রয়োজনীয় টাইপটি কেবল সংক্ষিপ্ত করুন, তারপরে কেবল "AS" ব্যবহার করুন যেখানে আপনার সাধারণত "স্ট্রিংবাই অ্যাপেন্ডিং স্ট্রিং" টাইপ হবে এবং কোডের প্রতি লাইন একাধিক সংযোজন উপভোগ করুন।

15
এই ম্যাক্রোগুলির সমস্যা হ'ল তারা উদ্দেশ্য-সি-এর অন্যতম প্রধান লক্ষ্যকে হ্রাস করে, যা পঠনযোগ্যতা। এটি "এএস" কী করে তা অত্যন্ত অস্পষ্ট। পাঠযোগ্যতার ব্যয়ে কয়েকটি কী-স্ট্রোক (যার বেশিরভাগ স্বতঃপূরণ দিয়ে পরিচালিত হয়) সংরক্ষণ করা খুব কম বাণিজ্য হ'ল। ব্যতিক্রমগুলি রয়েছে (@ "" সিনট্যাক্সটি + স্ট্রিংউইটআউটএফ 8 স্ট্রিং: প্রতিবার ব্যবহারের চেয়ে অনেক বেশি পঠনযোগ্য) তবে লক্ষ্যটি এখনও কেবল ব্রেভিটির পরিবর্তে পঠনযোগ্যতা হওয়া উচিত। আপনি একবার লিখুন, কিন্তু আপনি চিরতরে ডিবাগ করুন।
রব নেপিয়ার

হাই রব - আমি এতে আপনার সাথে একমত হতে পারি না। অবশ্যই, "এএস" একটি খারাপ নাম। এটির নাম সম্ভবত "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"];

উদ্দেশ্য সিআই এর সাথে বেশ কয়েক বছর পরে আপনি মনে করেন যে আপনি কী অর্জন করতে চাইছেন তা অর্জন করার জন্য এটি উদ্দেশ্য উদ্দেশ্য নিয়ে কাজ করার সেরা উপায়।

আপনার এক্সকোড অ্যাপ্লিকেশনটিতে "N" তে কী শুরু করুন এবং এটি "এনএসএসস্ট্রিং" এ স্বয়ংক্রিয়ভাবে পূর্ণ হয়। "স্ট্রিং" -তে কী এবং এটি "স্ট্রিংবাই অ্যাপেন্ডিং স্ট্রিং" এ স্বয়ংক্রিয়ভাবে পূর্ণ হয়। তাই কীস্ট্রোকগুলি বেশ সীমাবদ্ধ।

আপনি একবার "@" কীটি হিট করার এবং পঠনযোগ্য কোডটি লেখার প্রক্রিয়াটিকে ট্যাব করার হ্যাং পেয়ে গেলে আর সমস্যা হয়ে ওঠে না। এটা মানিয়ে নেওয়ার বিষয় মাত্র।


আপনি বুঝতে পারি যে আপনি সঠিক জিনিস তিনি চেয়েছিলেন পরামর্শ করছি না না করতে হবে, ঠিক আছে?
যে ব্যবহারকারী

8

c = [a stringByAppendingString: b]যেকোন সংক্ষিপ্ত করার একমাত্র উপায় হ'ল stবিন্দুর চারপাশে স্বতঃপূর্ণতা ব্যবহার করা । +অপারেটর সি, যা উদ্দেশ্য সি বস্তু কথা কে না জানে অংশ।


আপনি বুঝতে পারি যে আপনি সঠিক জিনিস তিনি চেয়েছিলেন পরামর্শ করছি না না করতে হবে, ঠিক আছে? খুব কমপক্ষে, একটি #defineএটি সংক্ষিপ্ত করতে ব্যবহৃত হতে পারে।
যে ব্যবহারকারী

8

কীভাবে সংক্ষিপ্তকরণ stringByAppendingStringএবং একটি # সংজ্ঞা ব্যবহার সম্পর্কে :

#define and stringByAppendingString

সুতরাং আপনি ব্যবহার করতে হবে:

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

সমস্যাটি হ'ল এটি কেবল দুটি স্ট্রিংয়ের জন্য কাজ করে, আপনাকে আরও সংযোজনগুলির জন্য অতিরিক্ত বন্ধনী মোড়ানো প্রয়োজন:

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

এক্সকোড 7 আপনাকে আর এই বিকল্পটি ব্যবহার করতে দেয় না - বলে "এবং" একটি সংরক্ষিত শব্দ। তবে কনস্যাটেনেশনের জন্য আপনি পরিবর্তে "বিড়াল" ব্যবহার করতে পারেন। আমি করেছি এবং আপনার সমাধান নিখুঁতভাবে কাজ করে এবং অত্যন্ত সহজ।
ভলমাইক


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
এটি কোনও এনএসউটেবল স্ট্রিংয়ের সর্বকালের সবচেয়ে খারাপ ব্যবহার। এনএসমিটেবল স্ট্রিংয়ের পুরো বিষয়টি হ'ল আপনার স্বাবলম্বিত স্ট্রিংগুলি তৈরি করার পদ্ধতিগুলির দরকার নেই তবে স্ট্রিংটি নিজেই পরিবর্তন করতে পারেন।
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];

প্রায় ভাল, "শূন্য" দিয়ে ভেরিআরগগুলি শেষ করা ব্যতীত তবে আমি মনে করি যে উদ্দেশ্য-সি এর আশেপাশে কোনও উপায় নেই।

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 

কেবল কনক্রিট স্ট্রিংয়ের জন্য, আমি এনএসএসটিংয়ের উপর একটি বিভাগ নির্ধারণ করেছি এবং এর সাথে একটি স্ট্যাটিক (+) সংমিশ্রণ পদ্ধতি যুক্ত করব যা স্ট্রিংটি ফেরত ব্যতীত উপরের লগ পদ্ধতির মতো দেখায়। এটি এনএসএসটিং এ রয়েছে কারণ এটি একটি স্ট্রিং পদ্ধতি এবং এটি স্থির কারণ আপনি 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

স্ট্রিংউইট ফরমেট ব্যবহার করে দেখুন:

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

আপনি কোনও বিভাগের সাথে এনএসআরিতে যোগদানের পদ্ধতি যুক্ত করে এটি অর্জন করতে পারেন:

#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

আমি পরীক্ষিত হয়ে গেলে এই ফর্ম্যাটগুলির একটিও এক্সকোড 7 এ কাজ করে:

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- পরীক্ষায় এটির প্রয়োজন সমস্ত উদ্দেশ্য সি প্রেমীদের জন্য:

-(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:@", "];
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.