Pregunta Extensión NSAttributedString en swift 3


Estoy migrando mi código para swift 3 y estoy teniendo problemas con esta extensión que estaba trabajando en la versión rápida anterior.

extension Data {
    var attributedString: NSAttributedString? {
        do {
            return try NSAttributedString(data: self, options:[NSDocumentTypeDocumentAttribute:NSHTMLTextDocumentType, NSCharacterEncodingDocumentAttribute: String.Encoding.utf8], documentAttributes: nil)
        } catch let error as NSError {
            print(error.localizedDescription)
        }
        return nil
    }
}

Ahora, cuando trato de llamar a este fragmento de código, aparece un error de excepción como este

error: warning: couldn't get required object pointer (substituting NULL): Couldn't load 'self' because its value couldn't be evaluated

Así es como llamo al método desde mi controlador de vista

let htmlCode = "<html><head><style type=\"text/css\">@font-face {font-family: Avenir-Roman}body {font-family: Avenir-Roman;font-size:15;margin: 0;padding: 0}</style></head><body bgcolor=\"#FBFBFB\">" + htmlBodyCode + "</body>"
newsDescription.attributedText = htmlCode.utf8Data?.attributedString

13
2017-08-31 11:13


origen


Respuestas:


Prueba esto:

extension Data {
    var attributedString: NSAttributedString? {
        do {
            return try NSAttributedString(data: self, options:[NSDocumentTypeDocumentAttribute:NSHTMLTextDocumentType, NSCharacterEncodingDocumentAttribute: String.Encoding.utf8.rawValue], documentAttributes: nil)
        } catch let error as NSError {
            print(error.localizedDescription)
        }
        return nil
    }
}

Como se describe en la referencia oficial, el valor de la clave NSCharacterEncodingDocumentAttribute necesita ser un NSNumber.

NSCharacterEncodingDocumentAttribute

El valor de este atributo es un NSNumber objeto que contiene entero que especifica NSStringEncoding   para el archivo;

En mayores Swifts, NSStringEncoding las constantes se importan como UInts, por lo que se conectan automáticamente a NSNumber cuando se convierte a AnyObject, como figura en NSDictionary.

Pero ahora, Swift introdujo un nuevo tipo de enumeración String.Encoding que no se origina como Objective-C enum. Y desafortunadamente, ahora cualquier tipo de Swift puede estar contenido en NSDictionary con tipo de referencia oculto intermedio _SwiftValue, que definitivamente NO es un NSNumber.

Por lo tanto, debe pasar algo que se puede unir a NSNumber como el valor de la clave NSCharacterEncodingDocumentAttribute. En tu caso, rawValue trabajaría.

En mi opinión, esto debería mejorarse, y mejor enviar un informe de error a manzana o swift.org.


33
2017-08-31 12:45



En caso de que alguien necesite ayuda en Swift 4+ :

extension Data {
    var attributedString: NSAttributedString? {
        do {
            return try NSAttributedString(data: self, options:[NSAttributedString.DocumentReadingOptionKey.documentType:NSAttributedString.DocumentType.html, NSAttributedString.DocumentReadingOptionKey.characterEncoding: String.Encoding.utf8.rawValue], documentAttributes: nil)
        } catch let error as NSError {
            print(error.localizedDescription)
        }
        return nil
    }
}

27
2017-07-05 05:25