Преобразование в Swift 3: SwiftValue unsignedIntegerValue

Я написал код на Swift 2 и преобразовал его в Swift 3. К сожалению, он больше не работает.

Вот инкриминируемый код:

func loadImage( url: String?, completionHandler: @escaping( UIImage?, NSError? ) -> Void ) {

    var theSrc: String?

    if let src = url {
        theSrc = src
    } else {
        theSrc = placeHolderImg
    }

    let url = URL( string: theSrc! )!
    let request = NSMutableURLRequest( url: url )

    URLSession.shared.dataTask( with: request as URLRequest ) { data, response, error in

        if error == nil {

            let image = UIImage( data:data! )
            completionHandler( image, nil )

        } else {

            completionHandler( nil, error as NSError? )

        }

    }.resume()

}

Эта функция вызывается так:

WordPressWebServices.sharedInstance.loadImage( url: theImgUrl, completionHandler: { ( image, error ) -> Void in

    DispatchQueue.main.async( execute: {

        //Some code

    } )

} )

Вот что я получаю из консоли отладки:

2016-10-19 06:40:15.458 tdr-ios-prototype[652:8825] -[_SwiftValue unsignedIntegerValue]: unrecognized selector sent to instance 0x6000000586f0
2016-10-19 06:40:15.478 tdr-ios-prototype[652:8825] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[_SwiftValue unsignedIntegerValue]: unrecognized selector sent to instance 0x6000000586f0'
*** First throw call stack:
(
    0   CoreFoundation                      0x000000010dac634b __exceptionPreprocess + 171
    1   libobjc.A.dylib                     0x000000010d52721e objc_exception_throw + 48
    2   CoreFoundation                      0x000000010db35f34 -[NSObject(NSObject) doesNotRecognizeSelector:] + 132
    3   CoreFoundation                      0x000000010da4bc15 ___forwarding___ + 1013
    4   CoreFoundation                      0x000000010da4b798 _CF_forwarding_prep_0 + 120
    5   UIFoundation                        0x0000000114e81953 -[NSHTMLReader _loadUsingWebKit] + 1329
    6   UIFoundation                        0x0000000114e82f15 -[NSHTMLReader attributedString] + 22
    7   UIFoundation                        0x0000000114e1945c _NSReadAttributedStringFromURLOrData + 5779
    8   UIFoundation                        0x0000000114e17d35 -[NSAttributedString(NSAttributedStringUIFoundationAdditions) initWithData:options:documentAttributes:error:] + 115
    9   tdr-ios-prototype                   0x000000010ceae80d _TTOFE5UIKitCSo18NSAttributedStringcfzT4dataV10Foundation4Data7optionsGVs10DictionarySSP__18documentAttributesGSqGVs33AutoreleasingUnsafeMutablePointerGSqCSo12NSDictionary____S0_ + 173
    10  tdr-ios-prototype                   0x000000010ceae6c4 _TFE5UIKitCSo18NSAttributedStringCfzT4dataV10Foundation4Data7optionsGVs10DictionarySSP__18documentAttributesGSqGVs33AutoreleasingUnsafeMutablePointerGSqCSo12NSDictionary____S0_ + 100
    11  tdr-ios-prototype                   0x000000010ceae14f _TFE17tdr_ios_prototypeSSCfT17htmlEncodedStringSS_GSqSS_ + 751
    12  tdr-ios-prototype                   0x000000010cea4191 _TFFFFC17tdr_ios_prototype11PostManager14getTheLastPostFT_T_U_FTGSqGSaGVs10DictionarySSPs9AnyObject____GSqCSo7NSError__T_U_FTGSqCSo7UIImage_GSqS3___T_U_FT_T_ + 545
    13  tdr-ios-prototype                   0x000000010cea55c0 _TPA__TFFFFC17tdr_ios_prototype11PostManager14getTheLastPostFT_T_U_FTGSqGSaGVs10DictionarySSPs9AnyObject____GSqCSo7NSError__T_U_FTGSqCSo7UIImage_GSqS3___T_U_FT_T_ + 512
    14  tdr-ios-prototype                   0x000000010ce7b827 _TTRXFo___XFdCb___ + 39
    15  libdispatch.dylib                   0x00000001119e9980 _dispatch_call_block_and_release + 12
    16  libdispatch.dylib                   0x0000000111a130cd _dispatch_client_callout + 8
    17  libdispatch.dylib                   0x00000001119f38d6 _dispatch_main_queue_callback_4CF + 406
    18  CoreFoundation                      0x000000010da8a4f9 __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 9
    19  CoreFoundation                      0x000000010da4ff8d __CFRunLoopRun + 2205
    20  CoreFoundation                      0x000000010da4f494 CFRunLoopRunSpecific + 420
    21  GraphicsServices                    0x0000000113903a6f GSEventRunModal + 161
    22  UIKit                               0x000000010e8e8f34 UIApplicationMain + 159
    23  tdr-ios-prototype                   0x000000010cea64ff main + 111
    24  libdyld.dylib                       0x0000000111a5f68d start + 1
    25  ???                                 0x0000000000000001 0x0 + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException

Я искал в Интернете и нашел несколько сообщений об ошибках такого рода, но не смог найти решение. Это проблема приведения типов или я неправильно использую обработчики завершения?

Из того, что я нашел, следующая строка кажется проблемой. Или, по крайней мере, это точка, в которой происходит сбой приложения.

completionHandler( image, nil )

Метод loadImage является частью процесса под названием LoadTheLastPost. Я работаю с Wordpress REST API V2. В основном объект с именем PostManager создается в AppDelegate (didFinishLaunchingWithOptions). Этот объект вызовет метод getTheLastPost, включенный в класс с именем WordPressWebServices, который является одноэлементным. Метод loadImage вызывается через getTheLasPost. Может, в этом что-то не так? Что вы думаете?

Может быть, я могу добавить, что после того, как я собрал данные, я создаю объект Post следующим образом:

let theLastPost = Post( id: postID!, title: String( htmlEncodedString: title! ), content: String( htmlEncodedString: content! ), imageId: imgID!, imageUrl: theImgUrl, image: theImg )

Вот краткий обзор моего класса Post:

class Post: NSObject, NSCoding {

    var id: Int
    var title: String?
    var content: String?
    var imageId: Int
    var imageUrl: String?
    var image: UIImage?

    init?( id: Int, title: String?, content: String?, imageId: Int, imageUrl: String?, image: UIImage? ) {

        self.id = id
        self.title = title
        self.content = content
        self.imageId = imageId
        self.imageUrl = imageUrl
        self.image = image

        super.init()

        if id < 1 {
            return nil
        }

    }

}

Любая помощь приветствуется! Большое спасибо!

ИЗМЕНИТЬ

Кажется, я ошибся в происхождении моей проблемы. Проблема исходит из этой строки:

let theLastPost = Post( id: postID!, title: String( htmlEncodedString: title! ), content: String( htmlEncodedString: content! ), imageId: imgID!, imageUrl: theImgUrl, image: theImg )

String( htmlEncodedString: title! ) и String( htmlEncodedString: content! ) вызывают ошибку.

Вот мое расширение String:

extension String {

    init?( htmlEncodedString: String ) {

        let encodedData = htmlEncodedString.data( using: String.Encoding.utf8 )!
        let attributedOptions: [ String: AnyObject ] = [ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType as AnyObject, NSCharacterEncodingDocumentAttribute: String.Encoding.utf8 as AnyObject ]

        var attributedString: NSAttributedString?

        do {
            attributedString = try NSAttributedString( data: encodedData, options: attributedOptions, documentAttributes: nil )
        } catch {
            print( error )
        }

        self.init( attributedString!.string )

    }

}

РЕШЕНИЕ

Проблема возникла из-за моего расширения String. Благодаря этому сообщению https://stackoverflow.com/a/39644620/1826332, которое я видел с самого начала, но подумал это было что-то другое, мне удалось найти решение.

пришлось отредактировать строку

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

...как это :

let attributedOptions: [ String: AnyObject ] = [ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType as AnyObject, NSCharacterEncodingDocumentAttribute: NSNumber(value: String.Encoding.utf8.rawValue) as AnyObject ]

person Lancelot    schedule 19.10.2016    source источник
comment
где вы вызываете этот метод?   -  person Bista    schedule 19.10.2016
comment
Привет! Спасибо за ваш отзыв! Я обновил свой вопрос.   -  person Lancelot    schedule 19.10.2016
comment
Вы должны опубликовать свой ответ как ответ, даже если он относится к вашему собственному вопросу, и пометить его как правильный.   -  person shawkinaw    schedule 09.03.2017