2016-09-22 2 views
43

Der folgende Code wurde perfekt mit Old Swift bearbeitet. Dies ist eine Erweiterung von StringSwift-3 Fehler: '- [_ SwiftValue unsignedIntegerValue]: unerkannter Selektor

func stringByConvertingHTML() -> String { 
    let newString = replacingOccurrences(of: "\n", with: "<br>") 
    if let encodedData = newString.data(using: String.Encoding.utf8) { 
     let attributedOptions : [String: AnyObject] = [ 
      NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType as AnyObject, 
      NSCharacterEncodingDocumentAttribute: String.Encoding.utf8 as AnyObject 
     ] 
     do { 
      let attributedString = try NSAttributedString(data: encodedData, options: attributedOptions, documentAttributes: nil) //Crash here 
      return attributedString.string 
     } catch { 
      return self 
     } 
    } 
    return self 
} 

Aber in schnellen 3 stürzt sagen

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[_SwiftValue unsignedIntegerValue]: unrecognized selector sent to instance 0x6080002565f0'

Wer mir bitte vorschlagen, was Sie brauchen, zu tun?

Antwort

81

Ich lief in das gleiche Problem:

let attributedOptions : [String: AnyObject] = [ 
      NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType as AnyObject, 
      NSCharacterEncodingDocumentAttribute: String.Encoding.utf8 as AnyObject 
     ] 

Hier die String.Encoding.utf8 die Typprüfung fehlschlägt. Verwenden Sie NSNumber(value: String.Encoding.utf8.rawValue)

+12

Dank es funktioniert gut. Aber es wird 'NSNumber (value: String.Encoding.utf8.rawValue)' –

+0

Lebensretter! (PS: Auch benötigt die NSNumber (..) zu arbeiten, könnten Sie plz aktualisieren die Antwort, um das stattdessen?) – Marchy

+6

Sie sollten nur 'String.Encoding.utf8.rawValue', wie Swift wird automatisch konvertieren' Int's und 'UInt' in' NSNumber', wenn ein Swift-Dictionary an eine Funktion übergeben wird, die ein 'NSDictionary' erwartet. Dies erfordert jedoch, dass das schnelle Wörterbuch ein '[String: Any]' Array ist. Siehe auch [this] (https://developer.apple.com/swift/blog/?id=39) Swift Blogeintrag. – MaddTheSane

42

In Swift3 keine Umwandlung in AnyObject mehr benötigt und auch keine NSNumber.

let attrs: [String: Any] = [ 
      NSDocumentTypeDocumentAttribute : NSHTMLTextDocumentType, 
      NSCharacterEncodingDocumentAttribute: String.Encoding.utf8.rawValue 
     ] 
+1

Ich würde sagen, das ist der _cleanest_ Weg, es zu tun. –

3

Dieser Beitrag hat meinen Tag gerettet. Nach der Migration zu Swift 3 wurde die kleine Änderung String.Encoding.utf8 zu String.Encoding.utf8.rawValue den hier beschriebenen Trap behoben.

Orignal Linie:

... 
    options: [NSDocumentTypeDocumentAttribute:NSHTMLTextDocumentType, 
       NSCharacterEncodingDocumentAttribute: String.Encoding.utf8], 
... 

geändert

options: [NSDocumentTypeDocumentAttribute:NSHTMLTextDocumentType, 
      NSCharacterEncodingDocumentAttribute: String.Encoding.utf8.rawValue], 
Verwandte Themen