objective c - اختصارات في Objective-C لسَلسَلة NSStrings




string-concatenation (20)

خيار:

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

هل هناك أي اختصارات 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:@"%@/%@/%@", three, two, one];

فمثلا:

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

إذا كان لديك 2 حرفية NSString ، يمكنك أيضًا القيام بذلك:

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

هذا مفيد أيضًا للانضمام إلى # تعريفات:

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

استمتع.


اختصار عن طريق إنشاء الماكرو AppendString (AS) ...

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

ملحوظة:

إذا كنت تستخدم الماكرو ، فكل ما عليك فعله هو استخدام الوسيطات المتغيرة ، راجع إجابة EthanB.


الطريقة الوحيدة لجعل c = [a stringByAppendingString: b] أي أقصر هو استخدام الإكمال التلقائي في جميع أنحاء نقطة st . عامل التشغيل + هو جزء من C ، والذي لا يعرف عن كائنات Objective-C.


جرب stringWithFormat:

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

حسنا ، لأن القولون هو نوع من الرمز الخاص ، ولكنه جزء من توقيع الطريقة ، فمن الممكن أن تمدد 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;
}

ثم ، في أي وظيفة تحتاج إليها ، قم بتعيين السلسلة أو textfield الخاص بك أو أي قيمة إرجاع لهذه الوظيفة.

أو ما يمكنك القيام به لإنشاء اختصار هو تحويل NSString إلى سلسلة c ++ واستخدام '+' هناك.

أتمنى أن يساعدك هذا!!!!!


طريقي المفضل هو:

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

عند إنشاء طلبات لخدمات الويب ، أجد أن القيام بشيء مثل ما يلي سهل للغاية ويجعل التسلسل قابلاً للقراءة في 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>"
};

في سويفت

let str1 = "This"
let str2 = "is just a test"

var appendStr1 = "\(str1) \(str2)" // appendStr1 would be "This is just a test"
var appendStr2 = str1 + str2 // // appendStr2 would be "This is just a test"

أيضًا ، يمكنك استخدام += عامل التشغيل نفسه على النحو التالي ...

var str3 = "Some String" 
str3 += str2            // str3 would be "Some String is just a test"

كان يحاول ما يلي في جزء lldb

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

ما هي الأخطاء.

بدلاً من ذلك استخدم أسلوب initWithFormat و initWithFormat :

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

لقد حاولت هذا الرمز. انها عملت بالنسبة لي.

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

ماذا عن اختصار stringByAppendingString واستخدام #define :

#define and stringByAppendingString

وبالتالي سوف تستخدم:

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

المشكلة هي أنه لا يعمل إلا مع سلسلتين ، فأنت مطالب بأن تقوم بتغليف أقواس إضافية لمزيد من الإلحاق:

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

وإليك طريقة بسيطة ، وذلك باستخدام الصيغة الحرفية للمصفوفة الجديدة:

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

يمكنك استخدام NSArray باسم

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

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

بعد عامين من الآن ، مع CI الهدف ، أعتقد أن هذه هي أفضل طريقة للعمل مع الهدف C لتحقيق ما تحاول تحقيقه.

ابدأ تشغيل "N" في تطبيق Xcode وإتمامه تلقائيًا إلى "NSString". المفتاح في "str" ​​وإكماله تلقائيًا إلى "stringByAppendingString". لذا فإن ضغطات المفاتيح محدودة للغاية.

بمجرد الحصول على تعليق ضرب "@" المفتاح و tabbing عملية كتابة التعليمات البرمجية القابلة للقراءة يصبح لم يعد مشكلة. انها مجرد مسألة التكيف.


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




string-concatenation