Ключ DocumentReadingOptionKey поврежден после миграции swift4

Используя следующий код, перенесенный с swift3 на swift4,

let options: [NSAttributedString.DocumentReadingOptionKey: AnyHashable] =
                          [.documentType: NSAttributedString.DocumentType.html, .characterEncoding: String.Encoding.utf8.rawValue]

            let str = try NSAttributedString( data:string!.data(using: String.Encoding.utf8, allowLossyConversion: true
                )!, options:options, documentAttributes: nil)

В iOS 9+ проблем нет, при запуске iOS 8.3 вывод консоли: «dyld: Symbol not found: _NSCharacterEncodingDocumentOption»; Он будет передан после комментария «.characterEncoding: String.Encoding.utf8.rawValue».


person Jenus Dong    schedule 29.09.2017    source источник
comment
Измените объявление типа значения словаря параметров с AnyHashable на Any. [NSAttributedString.DocumentReadingOptionKey : Any]   -  person Leo Dabus    schedule 29.09.2017
comment
stackoverflow.com/a/44391644/2303865   -  person Leo Dabus    schedule 29.09.2017
comment
Кстати, ваша подпись инициализатора NSAttributedString также неверна.   -  person Leo Dabus    schedule 29.09.2017
comment
@LeoDabus, он может пройти компилятор и хорошо работает для iOS 9+. Какова еще одна возможная правильная подпись для использования HTML для encodingCode?   -  person Jenus Dong    schedule 30.09.2017
comment
У меня такая же проблема. Вы нашли решение?   -  person nullproduction    schedule 04.10.2017


Ответы (2)


Я нашел решение. Вы должны удалить .characterEncoding для swift4. Работает на ios8,9,11.

Пример:

public func htmlToString() -> String? {
        guard let data = data(using: .utf8) else { return nil }
        do {
            return try NSAttributedString(
                data: data,
                options: [
                    .documentType: NSAttributedString.DocumentType.html
                ],
                documentAttributes: nil
            ).string
        } catch let error as NSError {
            print(error.localizedDescription)
            return  nil
        }
    }

Хорошего дня!

person nullproduction    schedule 04.10.2017
comment
Спасибо @nullrpoduction. Это не работает на iOS 10? ДА, удаление .characterEncoding может работать. Кодировка курса по умолчанию — UTF-8, так что работает. А если не кодируется utf-8, то как быть? - person Jenus Dong; 09.10.2017
comment
Например, в моем проекте используется следующий код [кодировка Unicode]: try NSAttributedString(data: string.data(using: String.Encoding.unicode, allowLossyConversion: true)!, options:[.documentType: NSAttributedString.DocumentType.html], атрибуты документа: ноль) - person Jenus Dong; 09.10.2017
comment
Спасибо, мое приложение отлично работало выше iOS 8, а для iOS 8 проблема оказалась в том, что вы сказали. Спас меня много. - person kubilay; 31.10.2017
comment
@kubilay Для iOS 8 этот способ будет работать NSAttributedString.DocumentReadingOptionKey(rawValue: "CharacterEncoding") - person Terence; 18.05.2018

Для всех iOS 8 используйте этот способ для ключа

NSAttributedString.DocumentReadingOptionKey(rawValue: "CharacterEncoding")

вместо того, чтобы положить

NSAttributedString.DocumentReadingOptionKey.characterEncoding

напрямую.

Примечание. Не используйте проверку версии для вызова NSAttributedString.DocumentReadingOptionKey.characterEncoding, иначе он все равно не будет работать.

person Terence    schedule 18.05.2018