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
، فإن كلا الوظيفتين مرشحان صالحان.
وأيضًا ، هل يجب علي كتابة محول لذلك؟
ليس عليك استخدام عناصر 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 يجب أن يحل المشكلة. لا تتردد في التعليق ويمكنني إعادة فتح التذكرة إذا لزم الأمر.
التعليق الأكثر فائدة
Sajjon راجع للشغل، AlamofireObjectMapper الآن يدعم
ImmutableMappable
في v4.1 ل