I'm migrating my code to swift 3 and I'm having a hard time with this extension that was working on the previous swift version.
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
}
}
Now when I try to call this piece of code I get an exception error like this
error: warning: couldn't get required object pointer (substituting NULL): Couldn't load 'self' because its value couldn't be evaluated
That's how I call the method from my view controller
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
In case anyone needs assist in Swift 4+ :
Try this:
As described in the official reference, the value for key
NSCharacterEncodingDocumentAttribute
needs to be anNSNumber
.In older Swifts,
NSStringEncoding
constants are imported asUInt
s, so they are automatically bridged toNSNumber
when converted toAnyObject
, as contained inNSDictionary
.But now, Swift introduced a new enum type
String.Encoding
which is not originated as an Objective-C enum. And unfortunately, now any Swift types can be contained in anNSDictionary
with intermediate hidden reference type_SwiftValue
, which definitely is NOT anNSNumber
.So, you need to pass something which can be bridged to
NSNumber
as the value for keyNSCharacterEncodingDocumentAttribute
. In your case,rawValue
would work.In my opinion, this should be improved, and better send a bug report to Apple or swift.org.