«JSONEncoder» / «JSONDecoder» неоднозначен для поиска типа в этом контексте.

Я получаю следующую ошибку

введите здесь описание изображения

Я не знаю, почему я получаю это, как я могу это решить? Пожалуйста помоги!

ПРИМЕЧАНИЕ. Я использую Xcode Version 9.3.1 и Swift4, я пытался использовать JSONCodable.JSONEncoder и JSONCodable.JSONDecoder, но это не сработает.

Вот код:

import Foundation
import JSONCodable

extension JSONEncoder {
    func encode(_ value: CGAffineTransform, key: String) {
        object[key] = NSValue(cgAffineTransform: value)
    }

    func encode(_ value: CGRect, key: String) {
        object[key] = NSValue(cgRect: value)
    }

    func encode(_ value: CGPoint, key: String) {
        object[key] = NSValue(cgPoint: value)
    }
}

extension JSONDecoder {

    func decode(_ key: String, type: Any.Type) throws -> NSValue {
        guard let value = get(key) else {
            throw JSONDecodableError.missingTypeError(key: key)
        }
        guard let compatible = value as? NSValue else {
            throw JSONDecodableError.incompatibleTypeError(key: key, elementType: type(of: value), expectedType: NSValue.self)
        }
        guard let objcType = String(validatingUTF8: compatible.objCType), objcType.contains("\(type)") else {
            throw JSONDecodableError.incompatibleTypeError(key: key, elementType: type(of: value), expectedType: type)
        }
        return compatible
    }

    func decode(_ key: String) throws -> CGAffineTransform {
        return try decode(key, type: CGAffineTransform.self).cgAffineTransformValue
    }

    func decode(_ key: String) throws -> CGRect {
        return try decode(key, type: CGRect.self).cgRectValue
    }

    func decode(_ key: String) throws -> CGPoint {
        return try decode(key, type: CGPoint.self).cgPointValue
    }
}

person Khushbu Desai    schedule 09.08.2018    source источник
comment
опубликуйте свой код, а также   -  person Dharmesh Kheni    schedule 09.08.2018
comment
Пожалуйста, проверьте, я обновил вопрос.   -  person Khushbu Desai    schedule 09.08.2018
comment
Почему вы частично изобретаете велосипед? Все CGAffineTransform, CGRect и CGPoint соответствуют Codable, и почему вы все равно используете стороннюю библиотеку?   -  person vadian    schedule 09.08.2018
comment
@vadian Я скачал этот проект с Github.   -  person Khushbu Desai    schedule 09.08.2018
comment
Встроенный протокол Codable безусловно в 100 раз эффективнее библиотеки 2-летней давности, при всем уважении к разработчику.   -  person vadian    schedule 09.08.2018


Ответы (1)


JSONCodable также объявляет классы JSONEncoder/JSONDecoder, поэтому компилятор не знает, какие из них вы хотите расширить: стандартные или из библиотеки.

Сообщив компилятору, какой класс следует расширить, добавив к классу префикс с именем модуля, вы должны устранить двусмысленность.

import Foundation
import JSONCodable

extension JSONCodable.JSONEncoder {
    // extension code
}

extension JSONCodable.JSONDecoder {
    // extension code
}

Однако это не сработает для этой конкретной библиотеки, так как библиотека объявляет протокол с тем же именем (JSONCodable). Таким образом, вам нужно явно импортировать только два класса из модуля (см. это сообщение SO для более подробной информации):

import Foundation
import class JSONCodable.JSONEncoder
import class JSONCodable.JSONDecoder

extension JSONCodable.JSONEncoder {
    // your code
}

extension JSONCodable.JSONDecoder {
    // your code
}
person Cristik    schedule 09.08.2018
comment
Я получаю эту ошибку "JSONEncoder" не является типом члена "JSONCodable" - person Khushbu Desai; 09.08.2018
comment
@KhushbuDesai обновил ответ, теперь он должен работать. - person Cristik; 09.08.2018