عند استخدام الرمز !
بجانب نوع المتغير في سويفت، يعني هذا أن المتغير هو optional ولكنه لن يكون nil
في وقت تشغيل البرنامج. وعند استخدام ?
يعني أن المتغير هو optional ويمكن أن يكون nil
في أي وقت.
في الشفرة التي قدمتها، قمت بتعريف p02
كـPerson!
و p03
كـPerson?
وقمت بتعيينهما إلى nil
. عندما تقوم بطباعة المتغير p03
، فإنه يطبع nil
بشكل صحيح لأنه optional ويمكن أن يكون nil
. أما عندما تحاول طباعة p02
، فإن البرنامج يثير خطأ fatal error: unexpectedly found nil while unwrapping an Optional value
لأنه تم تعيين p02
إلى nil
ولكنه تم تعريفه بنوع Person!
، مما يعني أنه يجب أن يحتوي على قيمة غير nil
.
لحل هذه المشكلة، يمكنك تأكد أولاً من أن قيمة p02
ليست nil
قبل طباعتها. يمكنك القيام بذلك بواسطة التحقق من القيمة بشكل مثل if let
كما هو موضح في الشفرة التالية:
swiftvar p02: Person! = nil
var p03: Person? = nil
if p02 == nil {
print("p02 is nil")
} else {
print(p02) // تمت طباعة p02 دون مشكلة
}
if p03 == nil {
print("p03 is nil")
} else {
print(p03)
}
باستخدام if let
يمكنك ضمان أن المتغير p02
ليس nil
قبل طباعته، وبالتالي تجنب الخطأ الذي تواجهه.
المزيد من المعلومات
في لغة البرمجة Swift، تُستخدم الـ Optional للإشارة إلى قيمة يمكن أن تكون nil
، أي عدم وجود قيمة. يمكن تعريف المتغيرات كـ Optional باستخدام علامتي الاستفهام ?
والتعجب !
.
-
Optional باستخدام
?
: يستخدم عندما يكون لديك متغير يمكن أن يحتوي على قيمة أوnil
. عند الوصول إلى قيمة متغير Optional، يجب عليك فحصها أولاً باستخدامif let
أوguard let
قبل استخدامها، لتجنب الأخطاء التي قد تحدث بسبب قيمتهاnil
. -
Optional باستخدام
!
: يستخدم عندما تكون متأكدًا من أن المتغير سيحتوي على قيمة في وقت التشغيل ولن يكونnil
. إذا كان المتغيرnil
عند استخدام!
، ستحدث أخطاء تشغيلية (runtime errors) مثل الخطأ الذي واجهته في حالة المتغيرp02
.
باستخدام !
، تُفرض تصريحًا (force unwrapping) لـ Optional، مما يعني أنك تقول للكود “أنا أعرف أن هذا القيمة ليست nil
، لذا قم بفتحها مباشرة دون فحص”. وهذا يزيد من خطورة الأخطاء التي يمكن أن تحدث، لذلك ينصح بعدم استخدامه إلا عندما تكون واثقًا من عدم وجود قيمة nil
.
للحفاظ على السلامة وتجنب الأخطاء، يُفضل استخدام if let
أو guard let
للتأكد من وجود قيمة قبل الوصول إليها في حالة المتغيرات Optional.