Как отформатировать несколько строк так, чтобы они были на одном уровне - PullRequest
0 голосов
/ 31 мая 2019

Описание

Я хочу отформатировать несколько строк так, чтобы они находились на одном уровне друг с другом. (См фактический результат и ожидаемый результат)

что я пробовал

Я реализовал это решение: https://stackoverflow.com/a/31613297/11582550 (См код) Это также работает, но только если я печатаю результат в консоли. Я хочу сохранить текст в label.text, который не работает.

некоторый код

func formattedString(left:String, right:String) -> String {
        let left = (left as NSString).utf8String
        let right = (right as NSString).utf8String
        print(String(format:"%-20s %-20s", left!, right!))
        return String(format:"%-20s %-20s", left!, right!)
    }

label.text += formattedString(left: "Firstname: ", right: "Alfred") + "\n" + formattedString(left:"Lastname: ", right: "LongLastname") + "\n" + formattedString(left:"Note:", right: "private")

// actual result

что я ожидал

## actual result (saved in label.text)
Firstname:    Alfred
Lastname:    LongLastname
Note:    private

## expected result (saved in label.text)
Firstname:    Alfred
Lastname:     LongLastname
Note:         private

Ответы [ 2 ]

0 голосов
/ 31 мая 2019

Ваша проблема в том, что вы используете пропорциональный шрифт вместо шрифта фиксированной ширины для вашего ярлыка.В пропорциональных шрифтах ширина символов варьируется, поэтому нельзя ожидать, что символы будут выравниваться.

Измените шрифт, который используется в вашем ярлыке, на шрифт с фиксированной шириной (например, Courier )., Курьер Новый , или Менло ), и это решит вашу проблему.

0 голосов
/ 31 мая 2019

Вместо использования низкоуровневых функций C и строк C (указателя) в Swift, я предлагаю использовать чистые манипуляции со строками Swift:

func formattedString(left: String, right: String, width: Int = 20) -> String {
    // The `max` call returns 0 if `width - left.count` is negative
    let filler = String(repeating: " ", count: max(0, width - left.count))
    return left + filler + right
}

let result = formattedString(left: "Firstname: ", right: "Alfred") + "\n" + formattedString(left:"Lastname: ", right: "LongLastname") + "\n" + formattedString(left:"Note:", right: "private")
print(result)

// Firstname:          Alfred
// Lastname:           LongLastname
// Note:               private

Чтобы отрезать длинные строки, вы можете сделать это так:

func limit(string: String, length: Int) -> String {
    if string.count <= length {
        return string
    }
    return string.prefix(length) + "…"
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...