Swift 3.0 конвертирует Double() в NSMutableAttributedString

заранее спасибо за помощь.

Я пытаюсь создать приложение-калькулятор (для определенных целей), и я хотел бы знать, существует ли способ конвертировать Double() в NSMutableAttributedString. Мне нужно это для ответа на вывод этикетки.

Причина использования NSMutableAttributedString заключается в том, что я хотел бы получить ответ с нижними и верхними сценариями.

//example of my code
var a = Double(), b = Double(), c = Double()
a = Double(textField1.text!)
b = Double(textField2.text!)
c = a + b
let font:UIFont? = UIFont(name: "Courier", size:12)
let fontSuper:UIFont? = UIFont(name: "Courier", size:10)


//for x_1 (subscript for "1")
x1_t:NSMutableAttributedString = NSMutableAttributedString(string: "x1", attributes: [NSFontAttributeName:font!])
x1_t.setAttributes([NSFontAttributeName:fontSuper!,NSBaselineOffsetAttributeName:-4], range: NSRange(location:1,length:1))


var result = NSMutableAttributedText()
// what to do to get output for a label like "x_1 = String(c) m"

Если существует другой способ, например, добавить String() в NSAtributedString() - я с нетерпением жду ответов.


person Robert Waltera    schedule 16.11.2016    source источник


Ответы (2)


Насколько я понимаю, ваши входные строки (названные «prestring1» и «afterstring1» в вашем собственном ответе) могут быть просто обычными строками без атрибутов, потому что вам нужно только, чтобы конечный результат был строкой с атрибутами.

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

Нравиться:

let randomstring = "Random ="
let afterstring = "m2"
let result: Double = 42.1

func stringer (pre: String,
               result: Double,
               post: String) -> NSMutableAttributedString
{
    let base = "\(pre) \(result) \(post)"
    let mutable = NSMutableAttributedString(string: base)
    mutable.addAttribute(NSBaselineOffsetAttributeName, value: 4,
                         range: NSRange(location: mutable.length - 2, length: 2))
    return mutable
}

let attributedString = stringer(pre: randomstring, result: result, post: afterstring)

Дает:

введите здесь описание изображения

person Eric Aya    schedule 17.11.2016
comment
Конечно, если я неправильно понял, и если вам нужны NSMutableAttributedString в качестве входных данных, пожалуйста, прокомментируйте, чтобы я мог обновить... или удалить. ;) - person Eric Aya; 17.11.2016
comment
Спасибо за ваш ответ! Мне очень нравится твой способ. Дело в том, что иногда мне нужно поставить атрибутную строку даже раньше (например, V_Ed = 21 m^2; _ нижний индекс, ^ верхний индекс). Я не мог найти реального учебника, как это сделать, кроме .append. То, как вы фактически создаете результат NSMutableAttributedString, а затем просто добавляете атрибуты, намного лучше и универсальнее, чем в моем случае, потому что вы можете настроить позже любую часть атрибутов в любой части текста. Вы ответили на мой вопрос, еще раз спасибо! - person Robert Waltera; 05.12.2016

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

var randomstring = "Random ="

var prestring1 = NSMutableAttributedString(string: randomstring)
var afterstring1 = NSMutableAttributedString(string: "m2")
var result1 = Double()
result1 = 42.1

func stringer (prestring: NSMutableAttributedString, result: Double, afterstring: NSMutableAttributedString) -> NSMutableAttributedString {
var mutableatributedresult = NSMutableAttributedString(string: String(result))
var mutableaddition = NSMutableAttributedString(string: " ")
var alltext = NSMutableAttributedString()

alltext.append(prestring)
alltext.append(mutableaddition)
alltext.append(mutableatributedresult)
alltext.append(mutableaddition)
alltext.append(afterstring)

return alltext
}

stringer(prestring: prestring1, result: result1, afterstring: afterstring1)

//This should give result of "Random = 42.1 m2"

Если кто-то знает лучшее решение, мне любопытно.

person Robert Waltera    schedule 17.11.2016