2016-09-22 2 views
43

Следующий код был отлично обработан старым быстрым. Это является продолжением строкиОшибка 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 
} 

Но в быстром 3 он выходит из строя говоря

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

Любой пожалуйста, предложите мне, что нужно делать?

ответ

81

Я столкнулся с той же проблемой:

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

String.Encoding.utf8 Здесь проверка типа не удается. Использовать NSNumber(value: String.Encoding.utf8.rawValue)

+12

Спасибо, что он работает нормально. Но это будет 'NSNumber (значение: String.Encoding.utf8.rawValue)' –

+0

Lifesaver! (PS: Также нужен NSNumber (..) для работы, не могли бы вы PLZ обновить ответ, чтобы включить это вместо?) – Marchy

+6

Вам просто нужно 'String.Encoding.utf8.rawValue', так как Swift автоматически преобразует' Int ' и 'UInt' в 'NSNumber', когда словарь Swift передается функции, ожидающей' NSDictionary'. Хотя для этого потребуется быстрый словарь, являющийся массивом '[String: Any]. См. Также [this] (https://developer.apple.com/swift/blog/?id=39) Быстрая запись в блоге. – MaddTheSane

42

В Swift3 не требуется никакого добавления в AnyObject, а также нет NSNumber.

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

Я бы сказал, что это способ _cleanest_ сделать это. –

3

Этот пост спас мой день. После перехода на Swift 3 небольшое изменение String.Encoding.utf8 на String.Encoding.utf8.rawValue зафиксировано здесь.

Orignal линия:

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

изменен

options: [NSDocumentTypeDocumentAttribute:NSHTMLTextDocumentType, 
      NSCharacterEncodingDocumentAttribute: String.Encoding.utf8.rawValue], 
Смежные вопросы