Swift-3错误:' - [_ SwiftValue unsignedIntegerValue]:无法识别的选择器

Tap*_*Pal 53 xcode exception ios swift3

以下代码与旧swift完美配合.这是String的扩展

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
}
Run Code Online (Sandbox Code Playgroud)

但是在迅速的3中,它崩溃了

***由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:' - [_ SwiftValue unsignedIntegerValue]:无法识别的选择器发送到实例0x6080002565f0'

有人请建议我需要做什么?

Sac*_*Vas 91

我遇到了同样的问题:

let attributedOptions : [String: AnyObject] = [
            NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType as AnyObject,
            NSCharacterEncodingDocumentAttribute: String.Encoding.utf8 as AnyObject
        ]
Run Code Online (Sandbox Code Playgroud)

这里的String.Encoding.utf8类型检查失败.使用NSNumber(value: String.Encoding.utf8.rawValue)

  • 谢谢它的工作正常.但它将是`NSNumber(value:String.Encoding.utf8.rawValue)` (13认同)
  • 你应该只需要`String.Encoding.utf8.rawValue`,因为当一个Swift字典被传递给一个期待一个`NSDictionary`的函数时,Swift会自动将`int`s和`UInt'转换成`NSNumber`s.虽然这需要将swift字典作为`[String:Any]`数组.另请参阅[this](https://developer.apple.com/swift/blog/?id=39)Swift博客条目. (7认同)

小智 47

在Swift3中,不再需要强制转换为AnyObject,也不需要NSNumber.

let attrs: [String: Any] = [
            NSDocumentTypeDocumentAttribute : NSHTMLTextDocumentType,
            NSCharacterEncodingDocumentAttribute: String.Encoding.utf8.rawValue
        ]
Run Code Online (Sandbox Code Playgroud)


小智 8

这篇文章救了我的一天.迁移到斯威夫特3,变化不大后 String.Encoding.utf8,以String.Encoding.utf8.rawValue固定这里报道的陷阱.

原始线:

...
    options: [NSDocumentTypeDocumentAttribute:NSHTMLTextDocumentType,
              NSCharacterEncodingDocumentAttribute: String.Encoding.utf8],
...
Run Code Online (Sandbox Code Playgroud)

变成

options: [NSDocumentTypeDocumentAttribute:NSHTMLTextDocumentType,
          NSCharacterEncodingDocumentAttribute: String.Encoding.utf8.rawValue],
Run Code Online (Sandbox Code Playgroud)

添加.rawValue到最后......