crear una cadena atribuida a partir de texto sin formato (con formato Android) de forma rápida para iOS

Estoy leyendo cadenas de un Localizable.strings que contiene algo como eso, que es básicamente lo que tienes en strings.xml de una aplicación de Android

"testShort" = "A <b>short</b>\ntest with another<b>bold text</b>";

El negrita y el avance de línea son los únicos dos atributos de formato que tengo en mis textos. Estoy tratando de desarrollar un método como este durante días sin éxito:

func ConvertText(inputText: String) -> NSAttributedString {
    // here comes the conversion to a representation with Helvetica 14pt and Helvetica-Bold 14pt including line feeds.
}

Mi objetivo final es mostrar el texto en el texto atribuido de UITextView.

Al ser un poco nuevo en Swift e iOS sin conocer Objective-C, encontré que es muy difícil hacer manipulaciones de cadenas, ya que son bastante diferentes y complejas y todos los ejemplos están en Objective-C. Lo que lo hace aún más difícil es que la mayoría de los métodos API no están disponibles o son diferentes en Swift que en Objective-C ...

Esto es lo que intenté hasta ahora para el cuerpo del método con la ayuda de muchas otras publicaciones aquí:

var test = inputText.dataUsingEncoding(NSUnicodeStringEncoding, allowLossyConversion: true)!
attrStr = NSAttributedString(
        data: test,
        options: [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType],
        documentAttributes: nil,
        error: nil)!
return attrStr

Los principales problemas aquí son que\n no se convierte y la fuente es muy pequeña y diferente.

Luego intenté en negrita manualmente una parte de un texto. Parece funcionar así:

var newText = NSMutableAttributedString(string: inputText)
newText.addAttribute(NSFontAttributeName, value: UIFont(name: "Helvetica-Bold", size: 14.0)!, range: NSRange(location:2,length:4))

Ahora intenté buscar los atributos en el texto, eliminándolos y usando el addAttribute como así

// Start of bold text
var range = newText.rangeOfString("<b>")!
// End of bold text
var range2 = newText.rangeOfString("</b>")!

// replacing attributes
newText = newText.stringByReplacingCharactersInRange(range, withString: "")
newText = newText.stringByReplacingCharactersInRange(range2, withString: "")

// creating a range for bold => error "'String.Index' is not convertible to 'int'"
// how to do such a thing
var boldRange = NSMakeRange(range.startIndex, range2.endIndex -3)

// setting bold
newText.addAttribute(NSFontAttributeName, value: UIFont(name: "Helvetica-Bold", size: 14.0)!, range: boldRange)

Todo este rango es mi problema principal en este momento, ya que es bastante diferente a una posición simple en la cadena.

Este problema es un gran ejemplo de la falta de documentación (o bien oculta):

losaddAttribute quiere un NSRange, elrangeOfString parece entregar un rango genérico de acuerdo con un mensaje de error que recibo, pero no hay información al respecto. El botón Buscar documentación en Xcode enrangeOfString() conduce a NSString. Buscando allírangeOfString()dice que vuelveNSRange. Hacer clic en eso lleva a la información de un alias de tipo para_NSRange que a su vez tiene dos propiedades NSUInteger llamadaslocation ylength. ¿Dónde está la propiedad startIndex y endIndex que veo en XCode? Muy confuso...

Sería genial si me puede dar algunos fragmentos o pistas sobre dónde me equivoco aquí o incluso el cuerpo del método, ya que todavía espero que no sea demasiado difícil si conoce bien iOS y Swift. Estoy apuntando a la compatibilidad con iOS 7.1, pero si es mucho más fácil con iOS 8, también está bien.

Respuestas a la pregunta(1)

Su respuesta a la pregunta