2016-09-22 15 views
43

Mã sau hoàn toàn hoạt động với tính năng nhanh cũ. Đây là một phần mở rộng của chuỗiLỗi Swift-3: '- [_ SwiftValue unsignedIntegerValue]: bộ chọn không được nhận dạng

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 
} 

Nhưng trong nhanh chóng 3 nó bị treo nói

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

Bất cứ ai tôi xin đề nghị những gì cần phải làm gì?

Trả lời

81

Tôi chạy vào cùng một vấn đề:

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

Ở đây String.Encoding.utf8 việc kiểm tra kiểu thất bại. Sử dụng NSNumber(value: String.Encoding.utf8.rawValue)

+12

Nhờ nó làm việc tốt. Nhưng nó sẽ là 'NSNumber (giá trị: String.Encoding.utf8.rawValue)' –

+0

Lifesaver! (PS: Cũng cần NSNumber (..) để làm việc, bạn có thể plz cập nhật câu trả lời để bao gồm thay vào đó?) – Marchy

+6

Bạn chỉ cần 'String.Encoding.utf8.rawValue', vì Swift sẽ tự động chuyển đổi' Int ' và 'UInt' vào 'NSNumber' khi một từ điển Swift được chuyển tới một hàm mong đợi một' NSDictionary'. Mặc dù điều đó đòi hỏi phải có từ điển nhanh chóng là một mảng '[String: Any]'. Xem thêm [this] (https://developer.apple.com/swift/blog/?id=39) mục nhập blog Swift. – MaddTheSane

42

Trong Swift3 không cần truyền tới AnyObject nữa và cũng không có NSNumber.

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

Tôi sẽ nói đây là cách _cleanest_ để làm điều đó. –

3

Bài đăng này đã lưu ngày của tôi. Sau khi chuyển sang Swift 3, thay đổi nhỏ String.Encoding.utf8 thành String.Encoding.utf8.rawValue cố định bẫy được báo cáo tại đây.

Orignal dòng:

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

đổi thành

options: [NSDocumentTypeDocumentAttribute:NSHTMLTextDocumentType, 
      NSCharacterEncodingDocumentAttribute: String.Encoding.utf8.rawValue], 
Các vấn đề liên quan