Objectmapper: "استخدام غامض للخريطة" عند استخدام ImmutableMappable.

تم إنشاؤها على ١٥ فبراير ٢٠١٧  ·  4تعليقات  ·  مصدر: tristanhimmelman/ObjectMapper

devxoul مرحبا! أحاول استخدام بروتوكول ImmutableMappable ، لكن لا يوجد تفسير في README لكيفية الاستخدام مع الكائنات المتداخلة.

أريد أن أجرب شيئًا بسيطًا مثل هذا:

struct Father: ImmutableMappable {
    let name: String
    let children: [Child]

    init(map: Map) throws {
        name = try map.value("name")
        children = try map.value("children", using: ArrayTransform<Child>())
    }
}

struct Child: ImmutableMappable {
    let age: Int

    init(map: Map) throws {
        age = try map.value("age")
    }
}

إذن لا يوجد Transform يعمل مع المصفوفات؟ لذلك كتبت المحول أدناه مستوحى من ListTransformer من "ObjectMapper-Realm"

struct ArrayTransform<T: ImmutableMappable> {}
extension ArrayTransform: TransformType {
    typealias Object = [T]
    typealias JSON = [Any]


    func transformFromJSON(_ value: Any?) -> Object? {
        if let objects = Mapper<T>().mapArray(JSONObject: value) {
            let list = Object()
            list.append(objectsIn: objects)
            return list
        }
        return nil
    }

    public func transformToJSON(_ value: Object?) -> JSON? {
        return value?.flatMap { $0.toJSON() }
    }
}

النتائج في خطأ الترجمة: Ambigious use of 'mapArray(JSONObject:)'

نظريتي هي أن ذلك لأن المترجم وجد الطريقة في هذين النطاقين:
public extension Mapper where N: ImmutableMappable
public final class Mapper<N: BaseMappable> {

ولكن نظرًا لأن ImmutableMappable يرث من BaseMappable ، فإن كلا الوظيفتين مرشحان صالحان.

كيفية استخدام ImmutableMappable للكائنات المتداخلة؟

وأيضًا ، هل يجب علي كتابة محول لذلك؟

التعليق الأكثر فائدة

Sajjon راجع للشغل، AlamofireObjectMapper الآن يدعم ImmutableMappable في v4.1 ل

ال 4 كومينتر

ليس عليك استخدام عناصر ArrayTransform. فقط قم بذلك على النحو التالي:

init(map: Map) throws {
  // ...
  children = try map.value("children")
}
ملاحظة: سبب فشل الإنشاء هو أنك لم تضع علامة على `mapArray ()` `try`.
 دع الأشياء = جرب مخطط() .mapArray (JSONObject: القيمة)
 // قم بعمل ما

devxoul مرحبا شكرا

بخصوص إجابتك P.S. - ما زلت لا أستطيع تشغيلها! أحاول الآن تنفيذ امتداد Alamofire + ObjectMapper بشكل مشابه لـ AlamofireObjectMapper ، ولكن مقابل ImmutableMappable

ما زلت أحصل على خطأ في التجميع Ambigious use of map.... ، ابحث عن التعليقين "// Compilation Error" في الكود أدناه.

ما الخطأ الذي افعله؟

import Foundation
import Alamofire
import ObjectMapper

extension DataRequest {

    enum ErrorCode: Int {
        case noData = 1
        case dataSerializationFailed = 2
    }

    internal static func newError(_ code: ErrorCode, failureReason: String) -> NSError {
        let errorDomain = "com.alamofireobjectmapper.error"

        let userInfo = [NSLocalizedFailureReasonErrorKey: failureReason]
        let returnError = NSError(domain: errorDomain, code: code.rawValue, userInfo: userInfo)

        return returnError
    }

    public static func ObjectMapperSerializer<T: ImmutableMappable>(_ keyPath: String?, mapToObject object: T? = nil, context: MapContext? = nil) -> DataResponseSerializer<T> {
        return DataResponseSerializer { request, response, data, error in
            guard error == nil else {
                return .failure(error!)
            }

            guard let _ = data else {
                let failureReason = "Data could not be serialized. Input data was nil."
                let error = newError(.noData, failureReason: failureReason)
                return .failure(error)
            }

            let jsonResponseSerializer = DataRequest.jsonResponseSerializer(options: .allowFragments)
            let result = jsonResponseSerializer.serializeResponse(request, response, data, error)

            let JSONToMap: Any?
            if let keyPath = keyPath , keyPath.isEmpty == false {
                JSONToMap = (result.value as AnyObject?)?.value(forKeyPath: keyPath)
            } else {
                JSONToMap = result.value
            }

            if let object = object {
                _ = Mapper<T>().map(JSONObject: JSONToMap, toObject: object)
                return .success(object)
            } else {
                do {
                    // Compilation Error: "Amigious user of 'map(JSONObject:)'"
                    let parsedObject = try Mapper<T>(context: context).map(JSONObject: JSONToMap)
                    return .success(parsedObject)
                } catch let error {
                    fatalError("Mapping error: \(error)")
                }
            }

            let failureReason = "ObjectMapper failed to serialize response."
            let error = newError(.dataSerializationFailed, failureReason: failureReason)
            return .failure(error)
        }
    }

    <strong i="16">@discardableResult</strong>
    public func responseObject<T: ImmutableMappable>(queue: DispatchQueue? = nil, keyPath: String? = nil, mapToObject object: T? = nil, context: MapContext? = nil, completionHandler: <strong i="17">@escaping</strong> (DataResponse<T>) -> Void) -> Self {
        return response(queue: queue, responseSerializer: DataRequest.ObjectMapperSerializer(keyPath, mapToObject: object, context: context), completionHandler: completionHandler)
    }

    public static func ObjectMapperArraySerializer<T: ImmutableMappable>(_ keyPath: String?, context: MapContext? = nil) -> DataResponseSerializer<[T]> {
        return DataResponseSerializer { request, response, data, error in
            guard error == nil else {
                return .failure(error!)
            }

            guard let _ = data else {
                let failureReason = "Data could not be serialized. Input data was nil."
                let error = newError(.dataSerializationFailed, failureReason: failureReason)
                return .failure(error)
            }

            let jsonResponseSerializer = DataRequest.jsonResponseSerializer(options: .allowFragments)
            let result = jsonResponseSerializer.serializeResponse(request, response, data, error)

            let JSONToMap: Any?
            if let keyPath = keyPath, keyPath.isEmpty == false {
                JSONToMap = (result.value as AnyObject?)?.value(forKeyPath: keyPath)
            } else {
                JSONToMap = result.value
            }

            do {
                // Compilation Error: "Amigious user of 'map(JSONObject:)'"
                let parsedObject = try Mapper<T>(context: context).mapArray(JSONObject: JSONToMap)
                return .success(parsedObject)
            } catch let error {
                fatalError("Failed to map, error: \(error)")
            }

            let failureReason = "ObjectMapper failed to serialize response."
            let error = newError(.dataSerializationFailed, failureReason: failureReason)
            return .failure(error)
        }
    }

    <strong i="18">@discardableResult</strong>
    public func responseArray<T: ImmutableMappable>(queue: DispatchQueue? = nil, keyPath: String? = nil, context: MapContext? = nil, completionHandler: <strong i="19">@escaping</strong> (DataResponse<[T]>) -> Void) -> Self {
        return response(queue: queue, responseSerializer: DataRequest.ObjectMapperArraySerializer(keyPath, context: context), completionHandler: completionHandler)
    }
}

Sajjon راجع للشغل، AlamofireObjectMapper الآن يدعم ImmutableMappable في v4.1 ل

إغلاق هذا كإصدار جديد من AlamofireObjectMapper يجب أن يحل المشكلة. لا تتردد في التعليق ويمكنني إعادة فتح التذكرة إذا لزم الأمر.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات

القضايا ذات الصلة

pcompassion picture pcompassion  ·  3تعليقات

YunyueLin picture YunyueLin  ·  3تعليقات

maksTheAwesome picture maksTheAwesome  ·  4تعليقات

adasoft-dev picture adasoft-dev  ·  3تعليقات

delbyze picture delbyze  ·  3تعليقات