التحقق من الأنواع باستخدام is
اختبر نوع النسخة قبل إجراء التحويل.
التحقق من الأنواع باستخدام is درس مجاني في Swift Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Swift Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Swift Academy 4 دروس في المجموع.
المعامل is
يُرجع معامل فحص النوع is قيمة من النوع Bool توضّح ما إذا كان المثيل من نوع معين أو من نوع فرعي منه. وهو لا يجري تحويلًا للنوع، بل يختبره فقط.
class Animal {
let name: String
init(name: String) { self.name = name }
}
class Dog: Animal {
func bark() -> String { return name + " says Woof" }
}
class Cat: Animal {
func meow() -> String { return name + " says Meow" }
}
let a: Animal = Dog(name: "Rex")
print(a is Dog)
print(a is Cat)اختبار الانتماء إلى نوع فرعي
تكون نتيجة is صحيحة عندما يكون المثيل من النوع المحدد تمامًا أو من أي صنف فرعي له. ويُعد Dog من نوع Animal.
class Animal {
let name: String
init(name: String) { self.name = name }
}
class Dog: Animal {
func bark() -> String { return name + " says Woof" }
}
class Cat: Animal {
func meow() -> String { return name + " says Meow" }
}
let a: Animal = Dog(name: "Rex")
print(a is Animal)
print(a is Dog)استخدام is في الشروط
يمكنكم التفرع بناءً على التحقق من النوع باستخدام if، واختيار السلوك وفقًا للنوع وقت التشغيل.
class Animal {
let name: String
init(name: String) { self.name = name }
}
class Dog: Animal {
func bark() -> String { return name + " says Woof" }
}
class Cat: Animal {
func meow() -> String { return name + " says Meow" }
}
let a: Animal = Cat(name: "Mia")
if a is Cat {
print("It is a cat")
} else {
print("Not a cat")
}عدّ الأنواع في مجموعة
من الاستخدامات المفيدة لـ is معرفة عدد العناصر التي تطابق نوعًا معينًا داخل مصفوفة مختلطة.
class Animal {
let name: String
init(name: String) { self.name = name }
}
class Dog: Animal {
func bark() -> String { return name + " says Woof" }
}
class Cat: Animal {
func meow() -> String { return name + " says Meow" }
}
let zoo: [Animal] = [Dog(name: "Rex"), Cat(name: "Mia"), Dog(name: "Buddy")]
let dogCount = zoo.filter { $0 is Dog }.count
print("Dogs:", dogCount)استخدام is مع البروتوكولات
يتحقق is أيضًا مما إذا كان أحد النُسخ متوافقًا مع بروتوكول، ويُرجع true عند تحقق ذلك.
protocol Flyer {}
class Bird: Flyer {}
class Fish {}
let creatures: [Any] = [Bird(), Fish()]
for c in creatures { print(c is Flyer) }is أم as؟
يجيب is عن سؤال بنعم أو لا فقط. أما as? فيتقدم خطوة إضافية ويمنحكم القيمة إذا احتجتم إلى استخدام أعضاء الفئة الفرعية.
class Animal {
let name: String
init(name: String) { self.name = name }
}
class Dog: Animal {
func bark() -> String { return name + " says Woof" }
}
class Cat: Animal {
func meow() -> String { return name + " says Meow" }
}
let a: Animal = Dog(name: "Rex")
print("Check only:", a is Dog)
if let d = a as? Dog { print("Use it:", d.bark()) }استخدام is مع guard
استخدموا is داخل guard للخروج مبكرًا عندما لا يكون النُسخة من النوع المتوقع.
class Animal {
let name: String
init(name: String) { self.name = name }
}
class Dog: Animal {
func bark() -> String { return name + " says Woof" }
}
class Cat: Animal {
func meow() -> String { return name + " says Meow" }
}
func onlyForCats(_ a: Animal) {
guard a is Cat else {
print("Skipping non-cat")
return
}
print("Processing a cat")
}
onlyForCats(Cat(name: "Mia"))
onlyForCats(Dog(name: "Rex"))دمج is في switch
يمكنكم إجراء التبديل بصورة غير مباشرة بناءً على فحوصات النوع، لكن مطابقة الأنماط باستخدام case is تكون أوضح عند التعامل مع عدة أنواع.
class Animal {
let name: String
init(name: String) { self.name = name }
}
class Dog: Animal {
func bark() -> String { return name + " says Woof" }
}
class Cat: Animal {
func meow() -> String { return name + " says Meow" }
}
let items: [Any] = [Dog(name: "Rex"), 42, "hello"]
for item in items {
switch item {
case is Dog: print("a dog")
case is Int: print("an integer")
default: print("something else")
}
}يتحقق is من النوع وقت التشغيل
يفحص is النوع الفعلي وقت التشغيل، وليس نوع المتغير المُعلن. فالمتغير من النوع Animal الذي يحتوي على Dog ينجح مع is Dog.
class Animal {
let name: String
init(name: String) { self.name = name }
}
class Dog: Animal {
func bark() -> String { return name + " says Woof" }
}
class Cat: Animal {
func meow() -> String { return name + " says Meow" }
}
let declaredAsAnimal: Animal = Dog(name: "Rex")
print("Runtime is Dog:", declaredAsAnimal is Dog)التحقق قبل التحويل القسري
من الأنماط الآمنة التحقق باستخدام is ثم استخدام as! فقط، لأنكم أثبتم صحة النوع.
class Animal {
let name: String
init(name: String) { self.name = name }
}
class Dog: Animal {
func bark() -> String { return name + " says Woof" }
}
class Cat: Animal {
func meow() -> String { return name + " says Meow" }
}
let a: Animal = Dog(name: "Rex")
if a is Dog {
let d = a as! Dog
print(d.bark())
}مثال موجز على التحقق من النوع
يوفر لكم استخدام is للتحقق وas? للتحويل معًا مجموعة أدوات متكاملة وآمنة للتعامل مع الأنواع وقت التشغيل.
class Animal {
let name: String
init(name: String) { self.name = name }
}
class Dog: Animal {
func bark() -> String { return name + " says Woof" }
}
class Cat: Animal {
func meow() -> String { return name + " says Meow" }
}
let zoo: [Animal] = [Dog(name: "Rex"), Cat(name: "Mia")]
for a in zoo {
if a is Dog { print("dog:", a.name) }
if a is Cat { print("cat:", a.name) }
}تحقق سريع
تذكّروا ما الذي يعيده العامل is.
مراجعة: التحقق من الأنواع باستخدام is
تعلّمتم أن is يعيد قيمة من النوع Bool للتحقق من انتماء القيمة إلى نوع وقت التشغيل، بما في ذلك الفئات الفرعية والتوافق مع البروتوكولات، وأنه يتكامل جيدًا مع التصفية وswitch case is، وأن التحقق باستخدام is قبل as! يجعل التحويل القسري آمنًا.
class Animal {
let name: String
init(name: String) { self.name = name }
}
class Dog: Animal {
func bark() -> String { return name + " says Woof" }
}
class Cat: Animal {
func meow() -> String { return name + " says Meow" }
}
let zoo: [Animal] = [Dog(name: "Rex"), Cat(name: "Mia"), Dog(name: "Buddy")]
print("Cats:", zoo.filter { $0 is Cat }.count)
print("Dogs:", zoo.filter { $0 is Dog }.count)الأسئلة الشائعة
هل درس «التحقق من الأنواع باستخدام is» مجاني؟
نعم — نص درس «التحقق من الأنواع باستخدام is» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Swift Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Swift Academy 4 دروس في المجموع.
ماذا ستتعلم في «التحقق من الأنواع باستخدام is»؟
اختبر نوع النسخة قبل إجراء التحويل. تتمرن على Swift Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Swift Academy؟
لا تُشترط خبرة سابقة. Swift Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «التحقق من الأنواع باستخدام is»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Swift Academy هذا؟
نعم. كل درس في Swift Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- أساسيات التحويل إلى النوع الأب والتحويل إلى النوع الابن
- التحويل الشرطي باستخدام as?
- التحويل الإجباري باستخدام as! ومخاطره
- التحقق من الأنواع باستخدام is