2015-04-21 1 views
7

Я хочу добавить строку к NSMutableString с помощью appendFormat, вставив пробелы, чтобы получить минимальную длину для моей строки.Как использовать appendFormat для форматирования строки в Swift?

В Objective-C, я просто использовал

[text.mutableString appendFormat:@"%-12s", "MyString"]; 

и я хотел бы получить

"MyString " 

Но в Swift, я попытался

text.mutableString.appendFormat("%-12s", "MyString") 

и я получаю все, но не «MyString». Кажется, некоторые случайные персонажи, которые я не знаю, откуда они взялись.

Есть ли кто-нибудь, кто знает, почему это происходит, и что я должен делать?

Спасибо, ребята!

+0

Я могу воспроизвести это на игровой площадке случайные символы меняются каждый раз, когда выполняется код. Используя 'str + = String (формат:"% - 12s "," Hello ")' и варианты. –

ответ

4

Вы должны использовать метод струны stringByPaddingToLength() следующим образом:

let anyString = "MyString" 
let padedString = anyString.stringByPaddingToLength(12, withString: " ", startingAtIndex: 0) // "MyString " 
+0

Это тоже хорошо работает, добавив пример, используя этот метод для моего ответа. Это намного более очевидно (где для преобразования cstring потребуется комментарий, чтобы объяснить, что происходит). –

1
let space: Character = " " 
    text = "MyString" + String(count: 12, repeatedValue: space) 
+0

Это просто добавит 12 пробелов в конец строки, вместо заполнения строки _up до_ минимум 12 символов. –

+0

Да, строка MyString может измениться на другую строку с разной длиной, вот почему мне нужно что-то простое, что может сделать сложную работу для меня –

2

Try:

text.mutableString.appendFormat("%[email protected]", "MyString") 

В Swift, "MyString" является Stringобъект. Спецификатор формата %s вызывает appendFormat(), чтобы интерпретировать его аргумент как строку стиля C (буфер char завершен нулем char).

В Objective-C "MyString" это просто строка стиля C. Вам нужно будет префикс его @, чтобы получить объект NSString (@"MyString").

+0

ничего не произошло:/ –

+0

Что значит «ничего не случилось»? Заявление делает * что-то *. Адам указывает, что Cocoa, похоже, не уважает ширину поля в спецификаторе формата при использовании '% @', что неутешительно. Это похоже на ошибку в Cocoa. –

+0

Спасибо, сэр! Только одно дополнение: «Строка» Swift - это не объект, афайк, это структура. –

3

Через объяснения Кена, что объект Swift строка представляет собой не эквивалент строки Objective-C C-типа (нуль-терминатором массив из char) Я нашел this answer, который показывает, как преобразовать объект Swift Струнный в CString , на котором корректно работает форматирование %-12s.

Вы можете использовать существующую строку форматирования следующим образом:

text.mutableString.appendFormat("%-12s", ("MyString" as NSString).UTF8String) 

Некоторые примеры:

var str = "Test" 
str += String(format:"%-12s", "Hello") 
// "Test–yç  " (Test, a dash, 11 random characters) 

var str2 = "Test" 
str2 += String(format:"%[email protected]", "Hello") 
// "TestHello" (no padding) 

var str3 = "Test" 
str3 += String(format:"%-12s", ("Hello" as NSString).UTF8String) 
// "TestHello  " ('Hello' string is padded out to 12 chars) 
+0

Это сработало отлично! Спасибо! –

Смежные вопросы