المشكلة التي تواجهها تبدو واضحة، وهي أنّ الهيكل ViewController.UserProfileRequest.Response
لا يتوافق مع بروتوكول GraphRequestProtocol
. لحل هذه المشكلة، يتطلب الأمر تعديل الهيكل UserProfileRequest.Response
ليتوافق مع متطلبات البروتوكول.
بموجب البروتوكول GraphRequestProtocol
، يجب أن يتضمن الهيكل الداخلي لـ Response
خاصية rawResponse
من النوع Any?
، وبالتالي، يجب تحديد مُعمَّم البداية (initializer) لتحويل الاستجابة الخام من نوع Any?
إلى الخصائص الأخرى المرغوبة.
لذا، يُمكن تعديل الهيكل UserProfileRequest.Response
كما يلي:
swiftstruct UserProfileRequest {
struct Response: GraphResponseProtocol {
let email: String?
init(rawResponse: Any?) {
if let json = rawResponse as? [String: Any],
let email = json["email"] as? String {
self.email = email
} else {
self.email = nil
}
}
}
}
في هذا التعديل، تمت إضافة خاصية email
التي تمثل البريد الإلكتروني المسترجع من الاستجابة. وفي المُعمَّم البداية init
، يتم فك ترميز الـ JSON لاستخراج البريد الإلكتروني من الاستجابة الخام، وتخزينه في الخاصية المحددة.
بعد هذا التعديل، يجب أن يتمكن الكود من التوافق مع بروتوكول GraphRequestProtocol
بشكل صحيح، ولا يجب أن تظهر الرسالة الخطأ التي ذكرتها.
المزيد من المعلومات
بعد تعديل هيكل الاستجابة، يمكن الآن استخدامه بشكل صحيح في الاتصال مع الطلب الرسمي. تتضمن الخطوات التالية الطريقة المناسبة لتكملة الكود:
swiftfileprivate struct UserProfileRequest: GraphRequestProtocol {
struct Response: GraphResponseProtocol {
let email: String?
init(rawResponse: Any?) {
if let json = rawResponse as? [String: Any],
let email = json["email"] as? String {
self.email = email
} else {
self.email = nil
}
}
}
let graphPath: String = "me"
let parameters: [String: Any]? = ["fields": "email"]
let accessToken: AccessToken? = AccessToken.current
let httpMethod: GraphRequestHTTPMethod = .GET
let apiVersion: GraphAPIVersion = .defaultVersion
}
fileprivate func returnUserData() {
let connection = GraphRequestConnection()
connection.add(UserProfileRequest()) { (response: HTTPURLResponse?, result: GraphRequestResult<UserProfileRequest.Response>) in
switch result {
case .success(let response):
if let email = response.email {
print("User's email is: \(email)")
} else {
print("Email not found in response.")
}
case .failed(let error):
print("Graph request failed with error: \(error)")
}
}
connection.start()
}
هذا الكود يقوم بإنشاء طلب معلومات المستخدم باستخدام الهيكل UserProfileRequest
الذي قمنا بتعديله. بعد ذلك، يتم إضافة هذا الطلب إلى اتصال GraphRequestConnection
وتنفيذه. عندما يتم استرجاع الاستجابة، يتم فحصها للتأكد من نجاح الطلب ومعالجة البيانات بشكل مناسب.
من خلال هذه الخطوات، يجب أن يكون بإمكانك الآن استرجاع بيانات المستخدم بنجاح من Facebook Graph API باستخدام Swift 3 دون أي مشاكل.