2016-09-22 11 views
43

以下のコードは、古いswiftで完全に機能しました。これは、文字列Swift-3エラー: ' - [_ SwiftValue unsignedIntegerValue]:認識できないセレクタ

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 
} 

の拡張である。しかし、SWIFT 3には

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

誰もが何をする必要があるかを私に提案してください?と言ってクラッシュ

答えて

81

私は同じ問題に遭遇した:String.Encoding.utf8型チェックが失敗した

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

。 Use NSNumber(value: String.Encoding.utf8.rawValue)

+12

おかげに変更

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

。しかし、それは 'NSNumber(value:String.Encoding.utf8.rawValue)' –

+0

ライフセーバー! (PS:NSNumber(..)が動作するためにも必要でしたが、代わりに答えを更新することができますか?) – Marchy

+6

Swiftは 'Int'sを自動的に変換するので' String.Encoding.utf8.rawValue'が必要ですSwift辞書が 'NSDictionary'を期待する関数に渡されたときに' UInt'sを 'NSNumber'sに変換します。これには、素早い辞書を '[String:Any]'配列にする必要があります。 [this](https://developer.apple.com/swift/blog/?id=39)Swiftブログエントリもご覧ください。 – MaddTheSane

42

Swift3では、AnyObjectへのキャストはもう必要なくNSNumberも必要ありません。

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

です。これは_cleanest_という方法です。 –

3

この投稿は保存しました。 Swift 3に移行した後、小さな変更String.Encoding.utf8String.Encoding.utf8.rawValueがここで報告されたトラップを修正しました。

のorignalライン:それは罰金働いて

options: [NSDocumentTypeDocumentAttribute:NSHTMLTextDocumentType, 
      NSCharacterEncodingDocumentAttribute: String.Encoding.utf8.rawValue], 
関連する問題