في لغة Swift، يكون do-catch
تابعا محدد النطاق (scoped)، مما يعني أن أي متغير يتم تعريفه داخل الـ do
لا يكون متاحا خارج هذا النطاق. في الحالة التي ذكرتها، المتغير novi
تم تعريفه خارج الـ do
، ولذلك لا يمكن الوصول إليه من خلال الـ catch
أو بعد نهاية الـ do
.
لحل هذه المشكلة، يمكنك تعريف novi
خارج الـ do-catch
وتعيين قيمته إلى القيمة الافتراضية المناسبة قبل البدء في الطلب إلى الخادم. ثم، يمكنك تحديث قيمة novi
داخل الـ do
بعد استلام النتيجة من الخادم. وهناك طرق عدة لتحقيق ذلك، وهذا مثال بسيط:
swiftvar novi: String = ""
do {
// إعداد الطلب وإرساله للخادم
let task = NSURLSession.sharedSession().dataTaskWithRequest(request){ data, response, error in
if error != nil{
print("Error 55 -> \(error)")
return
}
do {
let result = try NSJSONSerialization.JSONObjectWithData(data!, options: []) as? [String:AnyObject]
print("FIRST PRINT -> \(result!["password"])")
novi = String(result!["password"])
//return result
} catch {
print("Error 43-> \(error)")
}
}
task.resume()
}
catch {
//handle error. Probably return or mark function as throws
print(error)
}
print("SECOND PRINT -> \(novi)")
هذا المثال يحافظ على تعريف novi
خارج الـ do-catch
، ولكن يسمح بتحديث قيمته داخل الـ do
لتكون متاحة للاستخدام بعد الانتهاء من الـ do-catch
.
المزيد من المعلومات
بالطبع! في Swift، do-catch
تستخدم للتعامل مع الأخطاء (exceptions)، حيث يمكنك وضع الكود الذي يمكن أن يثير استثناء داخل كتلة do
، ثم التقاط ومعالجة هذا الاستثناء داخل الكتلة catch
.
في حالتك، تستخدم do-catch
لإرسال طلب POST إلى الخادم ومعالجة النتيجة المسترجعة. إذا كان هناك خطأ في الاتصال أو في تحويل البيانات إلى JSON، سيتم التقاط الاستثناء داخل الـ catch
والتعامل معه.
كما تم ذكره سابقًا، المتغير novi
تم تعريفه خارج النطاق الخاص بـ do-catch
، ولذلك لا يمكن الوصول إليه من الداخل. لحل هذه المشكلة، يمكنك تعريف novi
داخل الـ do
بقيمة افتراضية، ثم تحديثها داخل الـ do
حيث يتم تعيين القيمة الفعلية المسترجعة من الخادم.