NSStrings'i birleştirmek için Objective-C kısayolları


1129

stringByAppendingString:Objective-C'de ( ) dizesi birleştirme kısayolları veya NSStringgenel olarak çalışmak için kısayollar var mı?

Örneğin, yapmak istiyorum:

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

gibi bir şey:

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

4
Sadece birleştirme operatörü olarak '@ +' önermek istiyorum. Bunu Objective-C, kthxbai
powerj1984 bir

44
@NicolasMiari Objective-C'nin sahip olmadığı tek özellik bu değil. Onlarca kişi daha var. Jordão'nun bağlantısından alıntı : "Objective-C, künt olmak, ilkel bir dildir. Herhangi bir modern dil ile karşılaştırın ve hızlı bir şekilde eksik bulursunuz." Katılıyorum. Objective-C (1980'lerin başı), C (1970'lerin başı) olup, çok basit ve çok güvenli olmayan tipte bir OOP ilavesidir. Tamam, ama Java veya C # ile karşılaştırıldığında, çok eski moda hissediyor.
jcsahnwaldt, GoFundMonica

5
@NicolasMiari: Yorumlanan dil? C # ve Java derlenmiş dillerdir. Bayt koduna derlendi, daha sonra tekrar makine koduna derlendi.
Joren

3
İşler şimdi değişti: Swift (elma yeni dili) daha basit
Pradeep

6
"Tip güvenliği" ile ilgili olarak, bu bir stil sorunu olduğunu düşünüyorum. C # / C ++ 'dan gelen biri için, herhangi bir türden heterojen dizi dizisi olması tuhaf görünebilir, ancak Objective-C / Cocoa'ya alışkın biri için bu bir dinamizm ve özgürlük biçimidir; ne yaptığınızı bilmeniz bir avantajdır. Genç programcıların bu günlerde
basladığı

Yanıtlar:


616

Düşünebileceğim iki cevap ... ikisi de sadece bir birleştirme operatörüne sahip olmak kadar hoş değil.

İlk olarak, ekstra geçici dizelere olan ihtiyacın bir kısmını ortadan kaldıran NSMutableStringbir appendStringyöntemi olan bir an kullanın .

İkinci olarak, yöntemle NSArraybitiştirmek için a kullanın componentsJoinedByString.


34
Diğer seçeneğin birçok oyu olmasına rağmen, inşaatta tüm dizelerinizi bilmiyorsanız bu en iyi cevap olduğunu düşünüyorum. Her bir dize eklediğinizde, çok fazla ek yük oluşturursunuz. Değişken bir dize kullanmak bu sorunu ortadan kaldırır.
Eli

22
+1 @Eli ile aynı fikirde. Bunlar genellikle en iyi çözümlerdir. NSArray -componentsJoinedByString oldukça iyi bir şekilde tek bir satırda yapılabilir: string = [[NSArray arrayWithObjects: @ "This", "Is", "A", "Test", nil] componentsJoinedByString: @ ""];
Rob Napier

4
Bu cevap için +1. [NSMutableString appendString]daha fazla bellek dostudur [NSString stringByAppendingStrings].
Pierre-David Belanger

2
@RobNapier: Şimdi yeni dizi değişmez sözdizimi ile daha da iyi.
Amogh Talpallikar

27
[NSString stringWithFormat:@"%@/%@/%@", three, two, one];Teknik en şık görünüyor. Seçilen cevap bu olmalıdır.
ekillaby

1129

Bir seçenek:

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

Başka seçenek:

Birden fazla eklemeden (a + b + c + d) memnun olmadığınızı tahmin ediyorum, bu durumda şunları yapabilirsiniz:

NSLog(@"%@", [Util append:one, @" ", two, nil]); // "one two"
NSLog(@"%@", [Util append:three, @"/", two, @"/", one, nil]); // three/two/one

gibi bir şey kullanmak

+ (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
@pablasso Kabul etti. Util yöntemi oldukça çirkin. Böyle bir şey istiyorsanız, + stringByAppendingStrings: gibi bir adla bir NSString kategorisi olarak yapılmalıdır. NSStringForAppendedStrings (...) gibi bir ada sahip düz bir işlev bile Util gibi bir sınıftaki statik yöntemden daha iyi olurdu (adında "Util" olan herhangi bir şey muhtemelen kötü faktörlüdür). İşlev, sınırsız bir geçici otomatik olarak yayımlanan NSStrings kümesi oluşturmaktan kaçınmak için bir NSMutableString ve -appendString ile daha iyi uygulanır.
Rob Napier

1
Büyük dizelerle bu bellek israfına neden olabilir. Önerilen gerçek programlama dillerinde StringBuilder gibi bir şeydir. Ardından, gerçekten eklemeye başlamadan önce ne kadar bellek gerektiğini anlayabilirsiniz. Yukarıdaki yaklaşım bunu yapmak için yeniden düzenlenebilir. Ancak, bir StringBuilder nesnesi yapmak daha iyi olurdu, çünkü bu kullanıcının birleştirilmesi gereken tüm dizelerin listesini izlemek zorunda kalmasını önler.
George

Util'i nasıl ithal edersin? Bu IDE sinir bozucu (hiçbir öneri "bir şey ithal. Tutulma gibi" ve hiçbir yerde "Util" bahsetmiyorum. Bu kendimi kodlamak gerekiyordu bir sınıf mı?
Gubatron

stringWithFormat sadece çok zarif değil, aynı zamanda çok daha güçlüdür. İki dizeyi birleştirmek için @ "% @% @", üç dizeyi birleştirmek için @ "% @% @% @" ile kullanabilirsiniz, ancak isterseniz fazladan karakterler, baskı numaraları, isterseniz yeniden sıralayabilirsiniz. . Biçim dizesi yerelleştirilebilir ve on kat daha güçlü olur. Dize birleştirme yeni başlayanlar içindir.
gnasher729

150

2 NSString değişmeziniz varsa , bunu da yapabilirsiniz:

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

Bu, #defines'e katılmak için de yararlıdır:

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

Zevk almak.


13
@ CristiBăluță :) Ancak bu yalnızca dinamik olarak oluşturulmuş NSString örnekleriyle değil değişmez değerlerle çalışır .
Johannes Fahrenkrug

9
Aslında @ilk sonra dizelerde s gerekmez . @"I" " really" " enjoy"...
Kevin

Muhtemelen STRINGA ve STRINGB'yi parantez içine koymak istemelisiniz, aksi takdirde makro çözüldüğünde garip sonuçlar alabilirsiniz. #define KATILDI (STRINGA STRINGB)
digory doo

@JohannesFahrenkrug O zaman bu neden NSString* const SQL_CREATE_TABLE_str = @"CREATE TABLE IF NOT EXISTS " TABLE_NAME @" (...);";çalışmıyor? Ben yaşıyorum Expected '@' in program:( hatası
Vagif

@Vagif nasıl TABLE_NAMEtanımlanır?
Johannes Fahrenkrug

75

Bu gönderiye dönmeye devam ediyorum ve her zaman cevaplar arasında sıralama yaparak, gerektiği kadar çok değişkenle çalışan bu basit çözümü bulmak için sonlandırıyorum:

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

Örneğin:

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

48

Bir yöntem oluşturun:

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

Ardından, hangi işleve ihtiyacınız olursa olsun, dizenizi veya metin alanınızı ya da bu işlevin dönüş değeri için herhangi bir şeyi ayarlayın.

Veya bir kısayol yapmak için, NSString'i bir C ++ dizesine dönüştürün ve orada '+' kullanın.


Bu en basit çözüm.
GeneCode

44

Kolon tür özel sembol olmakla olarak Eh, bir yöntem imza bölümü, exted mümkündür NSStringbu eklemek için kategori ile olmayan deyimsel dize birleştirme tarzı:

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

Yararlı bulduğunuz kadar iki nokta üst üste bağımsız değişkeni tanımlayabilirsiniz ... ;-)

İyi bir ölçü için, dizelerin sonlandırılmış listesini concat:alan değişken argümanları da ekledim 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
Bunu bir yıl önce reddettim çünkü çok iyi bir cevap değil. Çok sayıda dizeyi birleştirmeyle başa çıkmak için Palimondo'nun uygulaması ya çok sayıda benzer görünümlü yöntem uygulanmasını ya da yöntemleri birkaç kez çağırmayı gerektirir ve bu da dizeleri birleştiren çok sayıda kodla sonuçlanır. Bu yaklaşımı kullanarak basit bir şeyden faydalanamazsınız stringWithFormat:. Sadece standart olmayan değil aynı zamanda kafa karıştırıcı olan adlandırılmış parametrelerin eksikliğinden bahsetmiyoruz.
FreeAsInBeer

2
Orijinal asker bahsetti stringByAppendingStringve ikiden fazla argüman kullanma hakkında hiçbir şey söylemedi. Bu cevabı kabul edilenlerden daha iyi seviyorum. Oldukça akıllı.
sudo

32

stringByAppendingString:Şu şekilde kullanın :

NSString *string1, *string2, *result;

string1 = @"This is ";
string2 = @"my string.";

result = [result stringByAppendingString:string1];
result = [result stringByAppendingString:string2];

VEYA

result = [result stringByAppendingString:@"This is "];
result = [result stringByAppendingString:@"my string."];

34
Sen onun istediği kesin bir şey öneriyorsan farkında mısın değil , hakkını yapmalı?
SilverSideDown

çok fazla sızıntı!
RamGrg

30

Makro:

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

Test Durumları:

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

Alternatif makro: (minimum sayıda bağımsız değişken uygulamak istiyorsanız)

// 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
Bu soruyu bir süredir kontrol etmedim, ama tüm bu yıllar sonra bunu doğru cevap olarak kabul etmeye yöneliyorum!
typeoneerror

1
Bu da tartışmalı -[NSString stringByAppendingString:]olarak bu kullanım durumundan daha iyi bir davranışa sahiptir - birincisi, argüman ise nilalıcı ise , bir istisna alırsınız . Bu nedenle, string besleyicinizde sessizce başarısız olma olasılığının% 50 ve istisnada% 50 olması muhtemeldir. İle stringConcatsize herhangi bir istisna garanti olsun nilher yerde listede. En azından daha tahmin edilebilir.
Tommy

27

Web hizmetleri için istek oluştururken, aşağıdaki gibi bir şey yapmak çok kolay ve Xcode içinde birleştirme okunabilir hale getirir:

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

Objektif-c noob için bu sözdiziminin ne yaptığını açıklayabilir misiniz? Bu bir dizeler dizisi oluşturuyor ve bir şekilde birleştiriyor mu? Herhangi bir dokümana yapılan bir referans da harika olurdu.
Norman H

2
@NormanH: Bu aslında C dilinin bir parçası. Biraz kazma sonra bulabildim bu . "Dize birleştirme" aşaması altında belirtilir: Tüm bitişik dize ve geniş dize değişmezleri birleştirilir. Örneğin, "String" "birleştirme", "String birleştirme" olur.
FreeAsInBeer

27

AppendString (AS) makrosu oluşturarak kısayol ...

#define AS (A, B) [(A) stringByAppendingString: (B)]
NSString * myString = @ "Bu"; NSString * test = AS (myString, @ "sadece bir testtir");

Not:

Bir makro kullanıyorsanız, elbette bunu değişken değişkenlerle yapın, EthanB'nin cevabına bakın.


Güzel! Yukarıdaki Util'in hala çok daha zarif bir çözüm olduğunu düşünüyorum; bu makroya yalnızca bir dize ekleyebilirsiniz, değil mi?
typeoneerror

1
Doğru, yukarıdaki AS makrosu her kod satırı için bir ekleme yapar. Birden çok ekleme ortak bir ihtiyaçsa, daha fazla makro oluşturulabilir. Örneğin, iki dize eklemek için bir makro: <pre> #define A2S (A, B, C) [[(A) stringByAppendingString: (B)] stringByAppendingString: (C)] </pre>

2
Ya da, "#define AS stringByAppendingString" gibi bir makro ile gereken yazmayı kısaltın, sonra normalde "stringByAppendingString" yazacağınız "AS" kullanın ve kod satırı başına birden fazla ekleme yapın.

15
Bu makrolarla ilgili sorun, okunabilirlik olan Objective-C'nin temel hedeflerinden birini zayıflatmalarıdır. "AS" nin ne yaptığı son derece belirsiz. Okunabilirlik pahasına birkaç tuşa (çoğu otomatik tamamlama ile işlenir) kaydetmek nadiren iyi bir değiş tokuştur. İstisnalar vardır (@ "" sözdizimi + stringWithUTF8String: her seferinde kullanmak zorunda olmaktan çok daha okunabilirdir), ancak hedef kısaca değil, okunabilirlik olmalıdır. Bir kez yazıyorsun ama sonsuza kadar hata ayıklıyorsun.
Rob Napier

Merhaba Rob - Bu konuda sana katılamıyorum. Elbette, "AS" kötü bir isim. Belki de "CAT" olarak adlandırılmalıdır.
Fattie

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

İşte yeni dizi değişmez sözdizimini kullanarak basit bir yol:

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

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

Objective CI ile birkaç yıl sonra bunun ulaşmak istediğinizi elde etmek için Objective C ile çalışmanın en iyi yolu olduğunu düşünüyorum.

Xcode uygulamanızda "N" girmeye başlayın, otomatik olarak "NSString" olarak tamamlanır. "str" ​​tuşuna bastığınızda otomatik olarak "stringByAppendingString" olarak tamamlanır. Bu yüzden tuş vuruşları oldukça sınırlıdır.

"@" Tuşuna bastığınızda ve okunabilir kod yazma işlemini sekmeye aldıktan sonra artık sorun olmaz. Bu sadece uyum sağlama meselesidir.


Sen onun istediği kesin bir şey öneriyorsan farkında mısın değil , hakkını yapmalı?
Kullanıcı olmayan kullanıcı

8

Daha c = [a stringByAppendingString: b]kısa yapmanın tek yolu, otomatik tamamlama stnoktasını kullanmaktır. +Operatör Objective-C nesneler hakkında bilmediği C parçasıdır.


Sen onun istediği kesin bir şey öneriyorsan farkında mısın değil , hakkını yapmalı? En azından a #definekısaltmak için kullanılabilir.
Kullanıcı olmayan kullanıcı

8

Nasıl kısaltarak hakkında stringByAppendingStringve kullanmak #define :

#define and stringByAppendingString

Böylece şunları kullanırsınız:

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

Sorun, sadece iki dize için çalışmasıdır, daha fazla ekleme için ek braketler sarmanız gerekir:

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

XCode7 artık bu seçeneği kullanmanıza izin vermiyor - "ve" ayrılmış bir sözcük. Bununla birlikte, conCATenation için "cat" kullanabilirsiniz. Yaptım ve çözümünüz mükemmel çalışıyor ve son derece basit.
Volomike

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

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

Bu kodu denedim. benim için çalıştı.

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

2
Bu şimdiye kadar bir NSMutableString kötü kötüye olduğunu. NSMutableString'in tüm amacı, otomatik olarak yayılan dizeler oluşturmak için yöntemlere ihtiyacınız olmaması, ancak dizenin kendisini değiştirebilmenizdir.
gnasher729

Katılıyorum. En azından appendString:bir NSMutableString.
Kullanıcı olmayan kullanıcı

6

Bölmede aşağıdakileri lldbdeniyordum

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

hangi hatalar.

bunun yerine ayır ve initWithFormatyöntemi kullanın :

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

1
... yorum yapmak için yeterli itibara sahip olsaydım ama umarım bu başka birine yardımcı olur.
Anthony De Souza

4

Bu, daha iyi günlüğe kaydetme ve yalnızca günlüğe kaydetme içindir - dicius mükemmel çoklu argüman yöntemine dayanır. Bir Logger sınıfı tanımlar ve şöyle çağırır:

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

Neredeyse iyi, "nil" ile var args sona erdirmek dışında ama sanırım Objective-C bunun hiçbir yolu yoktur.

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 

Sadece amacıyla concat dizeleri, ben NSString üzerinde Bir Kategori tanımlamak istiyorum ve tam olarak dize döndürür hariç yukarıda günlük yöntemine gibi kendisine o görünüyor statik (+) concatenate yöntemini ekleyin. NSString'de çünkü bir dize yöntemidir ve statiktir çünkü 1-N dizelerinden yeni bir dize oluşturmak istediğinizde, bunu ekin parçası olan dizelerden herhangi birinde çağırmazsınız.


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'ı deneyin:

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

Neden 2 downvotes var? Başka bir cevapta daha önce bahsedilmiş olduğu için mi?
Reimius

3

Dizelerle uğraşırken ObjC ++ kaynak dosyasını yapmak daha kolay olur, o zaman soruda gösterilen ikinci yöntemi kullanarak std :: dizeleri birleştirebilirsiniz.

std::string stdstr = [nsstr UTF8String];

//easier to read and more portable string manipulation goes here...

NSString* nsstr = [NSString stringWithUTF8String:stdstr.c_str()];

3

Tercih ettiğim yöntem şudur:

NSString *firstString = @"foo";
NSString *secondString = @"bar";
NSString *thirdString = @"baz";

NSString *joinedString = [@[firstString, secondString, thirdString] join];

NSArray'e bir kategori ile birleştirme yöntemi ekleyerek bunu başarabilirsiniz:

#import "NSArray+Join.h"
@implementation NSArray (Join)
-(NSString *)join
{
    return [self componentsJoinedByString:@""];
}
@end

@[] bunun kısa tanımı NSArray , bu dizeleri birleştirmek için en hızlı yöntem olduğunu düşünüyorum.

Kategoriyi kullanmak istemiyorsanız, doğrudan componentsJoinedByString:yöntemi kullanın :

NSString *joinedString = [@[firstString, secondString, thirdString] componentsJoinedByString:@""];

3

NSArray'ı şu şekilde kullanabilirsiniz:

NSString *string1=@"This"

NSString *string2=@"is just"

NSString *string3=@"a test"  

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

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

veya

kullanabilirsiniz

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

1

Test ettiğimde bu biçimlerden biri XCode7'de çalışıyor:

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

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

Herhangi bir nedenle, yalnızca karışımın ilk dizesinde @ işleç karakterine ihtiyacınız vardır.

Ancak, değişken ekleme ile çalışmaz. Bunun için , "kedi" yerine "ve" yerine makro kullanmak dışında bu son derece basit çözümü kullanabilirsiniz .


nasıl yapılır? örneğin: sTest3 = sTest1 + sTest2;

@ user285594 Sorunun konusu buydu: Objective-C'de sözdizimine izin verilmiyor. Diğer cevaplara bakın.
Kullanıcı olmayan kullanıcı

1

Bir UI Testinde buna ihtiyaç duyan tüm Objektif C sevenler için:

-(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

Orada kaç tane ip olduğunu bilmediğinizi düşünelim.

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:@", "];
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.