English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

تحويلات الأنواع Swift

يمكن للتحويل النوعي في Swift الحكم على نوع العينة. يمكن أيضًا استخدامه للتحقق من ما إذا كان نوع العينة ينتمي إلى نوع الأب أو الفروع.

في Swift، يتم تنفيذ التحويل النوعي باستخدام عمود is و as،is لتحديد نوع القيمة،as للتحويل إلى نوع.

يمكن أيضًا استخدام التحويل النوعي للتحقق من ما إذا كانت الفئة قد أتمت تنفيذ معيار معين.

تعريف بنية الفئات الفرعية

تعريف ثلاثة كلاسات: Subjects،Chemistry،Maths،Chemistry و Maths يرثان من Subjects.

البرنامج التالي:

class Subjects {
    var physics: String
    init(physics: String) {
        self.physics = physics
    }
}
class Chemistry: Subjects {
    var equations: String
    init(physics: String, equations: String) {
        self.equations = equations
        super.init(physics: physics)
    }
}
class Maths: Subjects {
    var formulae: String
    init(physics: String, formulae: String) {
        self.formulae = formulae
        super.init(physics: physics)
    }
}
let sa = [
    Chemistry(علم الفيزياء: "علم الفيزياء الصلبة", معادلات: "هيرتز"),
    Maths(physics: "ديناميكا السوائل", formulae: "تيراهرتز")
دعوة samplechem = Chemistry(physics: "مادة صلبة", equations: "هيرتز")
اطبع("نموذج الفيزياء هو: \(samplechem.physics)")
اطبع("نموذج المعادلة هو: \(samplechem.equations)")
دعوة samplemaths = Maths(physics: "ديناميكا السوائل", formulae: "تيراهرتز")
اطبع("نموذج الفيزياء هو: \(samplemaths.physics)")
اطبع("نموذج المعادلة هو: \(samplemaths.formulae)")

نتائج تنفيذ البرنامج أعلاه هي:

نموذج الفيزياء هو: ميكانيكا المواد الصلبة
نموذج المعادلة هو: هرتز
نموذج الفيزياء هو: ديناميكا السوائل
نموذج المعادلة هو: جيجاهرتز

تحقق من النوع

استخدام التحويل النوعي لتحديد ما إذا كان نوع العينة ينتمي إلى نوع معين.

يمكنك استخدامها في بنية السلسلة من الفئات والفروع، للتحقق من نوع عينة معينة والتحويل نوع عينة إلى نوع آخر في تلك السلسلة.

استخدام التحقق من النوع is كلمة مفتاحية.

عمود is للتحقق من أن العينة تنتمي إلى نوع فرعي معين. إذا كانت العينة تنتمي إلى ذلك النوع الفرعي، عودة معادلة التحقق على true، وإلا عودة false.

class Subjects {
    var physics: String
    init(physics: String) {
        self.physics = physics
    }
}
class Chemistry: Subjects {
    var equations: String
    init(physics: String, equations: String) {
        self.equations = equations
        super.init(physics: physics)
    }
}
class Maths: Subjects {
    var formulae: String
    init(physics: String, formulae: String) {
        self.formulae = formulae
        super.init(physics: physics)
    }
}
let sa = [
    Chemistry(علم الفيزياء: "علم الفيزياء الصلبة", معادلات: "هيرتز"),
    Maths(علم الفيزياء: "علم ديناميكا السوائل", معادلات: "جيجاهرتز"),
    Chemistry(علم الفيزياء: "علم الفيزياء الحرارية", معادلات: "ديسيبيل"),
    Maths(علم الفيزياء: "علم الفيزياء الكونية", معادلات: "تيراهرتز"),
    Maths(physics: "معادلات التفاضل والتكامل", formulae: "مجموعات جيبية")]
دعوة samplechem = Chemistry(physics: "مادة صلبة", equations: "هيرتز")
اطبع("نموذج الفيزياء هو: \(samplechem.physics)")
اطبع("نموذج المعادلة هو: \(samplechem.equations)")
دعوة samplemaths = Maths(physics: "ديناميكا السوائل", formulae: "تيراهرتز")
اطبع("نموذج الفيزياء هو: \(samplemaths.physics)")
اطبع("نموذج المعادلة هو: \(samplemaths.formulae)")
دعوة chemCount = 0
دعوة mathsCount = 0
for item in sa {
    // إذا كان العينة نوع Chemistry، عودة true، وإلا عودة false.
    if item is Chemistry {
        ++chemCount
    } else if item is Maths {
        ++mathsCount
    }
}
print("مادة الكيمياء تحتوي على \(chemCount) موضوع، مادة الرياضيات تحتوي على \(mathsCount) موضوع")

نتائج تنفيذ البرنامج أعلاه هي:

نموذج الفيزياء هو: ميكانيكا المواد الصلبة
نموذج المعادلة هو: هرتز
نموذج الفيزياء هو: ديناميكا السوائل
نموذج المعادلة هو: جيجاهرتز
مادة الكيمياء تحتوي على 2 موضوع، مادة الرياضيات تحتوي على 3 مواضيع

التحويل إلى نوع أقل

التحويل إلى نوع أقل، باستخدام عمليات التحويل النوعي (as? أو as!)

استخدم شكل التحويل الخاص (as?) عندما تكون غير متأكد من نجاح التحويل إلى الأسفل. دائمًا ما يرجع الشكل الخاص للتحويل إلى قيمة اختيارية (optional value)، وسيكون القيمة الاختيارية nil إذا كان التحويل غير ممكن.

استخدم الشكل القسري (as!) فقط عندما تكون متأكدًا من نجاح التحويل إلى الأسفل. عند محاولة تحويل إلى نوع غير صحيح، يسبب تحويل الشكل القسري خطأ في وقت التشغيل.

class Subjects {
    var physics: String
    init(physics: String) {
        self.physics = physics
    }
}
class Chemistry: Subjects {
    var equations: String
    init(physics: String, equations: String) {
        self.equations = equations
        super.init(physics: physics)
    }
}
class Maths: Subjects {
    var formulae: String
    init(physics: String, formulae: String) {
        self.formulae = formulae
        super.init(physics: physics)
    }
}
let sa = [
    Chemistry(علم الفيزياء: "علم الفيزياء الصلبة", معادلات: "هيرتز"),
    Maths(علم الفيزياء: "علم ديناميكا السوائل", معادلات: "جيجاهرتز"),
    Chemistry(علم الفيزياء: "علم الفيزياء الحرارية", معادلات: "ديسيبيل"),
    Maths(علم الفيزياء: "علم الفيزياء الكونية", معادلات: "تيراهرتز"),
    Maths(physics: "معادلات التفاضل والتكامل", formulae: "مجموعات جيبية")]
دعوة samplechem = Chemistry(physics: "مادة صلبة", equations: "هيرتز")
اطبع("نموذج الفيزياء هو: \(samplechem.physics)")
اطبع("نموذج المعادلة هو: \(samplechem.equations)")
دعوة samplemaths = Maths(physics: "ديناميكا السوائل", formulae: "تيراهرتز")
اطبع("نموذج الفيزياء هو: \(samplemaths.physics)")
اطبع("نموذج المعادلة هو: \(samplemaths.formulae)")
دعوة chemCount = 0
دعوة mathsCount = 0
for item in sa {
    // شكل شروطي للتحويل
    إذا كان let show = item كـ? Chemistry {
        اطبع("موضوع الكيمياء هو: '\(show.physics)', \(show.equations)")
        // شكل قسري
    } آخره إذا كان let example = item كـ? Maths {
        اطبع("موضوع الرياضيات هو: '\(example.physics)', \(example.formulae)")
    }
}

نتائج تنفيذ البرنامج أعلاه هي:

نموذج الفيزياء هو: ميكانيكا المواد الصلبة
نموذج المعادلة هو: هرتز
نموذج الفيزياء هو: ديناميكا السوائل
نموذج المعادلة هو: جيجاهرتز
الموضوع الكيمياء هو: 'ميكانيكا المواد الصلبة', هرتز
الموضوع الرياضيات هو: 'ديناميكا السوائل', جيجاهرتز
الموضوع الكيمياء هو: 'فيزياء الحرارة', ديسيبل
الموضوع الفيزياء هو: 'فيزياء الكواكب', ميجاهرتز
الموضوع الرياضيات هو: 'معادلات التفاضل والتكامل', السينوسية

تحويلات أنواع Any و AnyObject

قدمت Swift نوعين خاصين من الaliases للنوع غير المعروف:

  • AnyObjectيمكن تمثيل أي مثال على class.
  • Anyيمكنهما تمثيل أي نوع، بما في ذلك أنواع نوعي (function types).

ملاحظة:
استخدمهما فقط عندما تحتاج إلى سلوكيات أو وظائف محددةAnyوالAnyObjectفمن الأفضل دائمًا استخدام النوع المحدد الذي تتوقع استخدامه في شifrتك.

مثال Any

class Subjects {
    var physics: String
    init(physics: String) {
        self.physics = physics
    }
}
class Chemistry: Subjects {
    var equations: String
    init(physics: String, equations: String) {
        self.equations = equations
        super.init(physics: physics)
    }
}
class Maths: Subjects {
    var formulae: String
    init(physics: String, formulae: String) {
        self.formulae = formulae
        super.init(physics: physics)
    }
}
let sa = [
    Chemistry(علم الفيزياء: "علم الفيزياء الصلبة", معادلات: "هيرتز"),
    Maths(علم الفيزياء: "علم ديناميكا السوائل", معادلات: "جيجاهرتز"),
    Chemistry(علم الفيزياء: "علم الفيزياء الحرارية", معادلات: "ديسيبيل"),
    Maths(علم الفيزياء: "علم الفيزياء الكونية", معادلات: "تيراهرتز"),
    Maths(physics: "معادلات التفاضل والتكامل", formulae: "مجموعات جيبية")]
دعوة samplechem = Chemistry(physics: "مادة صلبة", equations: "هيرتز")
اطبع("نموذج الفيزياء هو: \(samplechem.physics)")
اطبع("نموذج المعادلة هو: \(samplechem.equations)")
دعوة samplemaths = Maths(physics: "ديناميكا السوائل", formulae: "تيراهرتز")
اطبع("نموذج الفيزياء هو: \(samplemaths.physics)")
اطبع("نموذج المعادلة هو: \(samplemaths.formulae)")
دعوة chemCount = 0
دعوة mathsCount = 0
for item in sa {
    // شكل شروطي للتحويل
    إذا كان let show = item كـ? Chemistry {
        اطبع("موضوع الكيمياء هو: '\(show.physics)', \(show.equations)")
        // شكل قسري
    } آخره إذا كان let example = item كـ? Maths {
        اطبع("موضوع الرياضيات هو: '\(example.physics)', \(example.formulae)")
    }
}
// يمكن تخزين مصفوفة من النوع Any exampleany
دعوة exampleany = [Any]()
exampleany.append(12)
exampleany.append(3.14159)
exampleany.append("مثال أي")
exampleany.append(Chemistry(physics: "مادة صلبة", equations: "تيراهرتز"))
للـ item2 في exampleany {
    اختر item2 {
    حالة دعوة someInt كـ Int:
        اطبع("قيمة كاملة هي \(someInt)")
    حالة دعوة someDouble كـ Double حيث someDouble > 0:
        اطبع("قيمة بيتا هي \(someDouble)")
    حالة دعوة someString كـ String:
        print("\(someString)")
    case let phy as Chemistry:
        print("الموضوع '\(phy.physics)', \(phy.equations)")
    default:
        print("None")
    }
}

نتائج تنفيذ البرنامج أعلاه هي:

نموذج الفيزياء هو: ميكانيكا المواد الصلبة
نموذج المعادلة هو: هرتز
نموذج الفيزياء هو: ديناميكا السوائل
نموذج المعادلة هو: جيجاهرتز
الموضوع الكيمياء هو: 'ميكانيكا المواد الصلبة', هرتز
الموضوع الرياضيات هو: 'ديناميكا السوائل', جيجاهرتز
الموضوع الكيمياء هو: 'فيزياء الحرارة', ديسيبل
الموضوع الفيزياء هو: 'فيزياء الكواكب', ميجاهرتز
الموضوع الرياضيات هو: 'معادلات التفاضل والتكامل', السينوسية
قيمة العدد الصحيح هي 12
قيمة Pi هي 3.14159
مثال Any
الموضوع 'ميكانيكا المواد الصلبة', ميجاهرتز

مثال AnyObject

class Subjects {
    var physics: String
    init(physics: String) {
        self.physics = physics
    }
}
class Chemistry: Subjects {
    var equations: String
    init(physics: String, equations: String) {
        self.equations = equations
        super.init(physics: physics)
    }
}
class Maths: Subjects {
    var formulae: String
    init(physics: String, formulae: String) {
        self.formulae = formulae
        super.init(physics: physics)
    }
}
// مصفوفة [AnyObject] النوع
let saprint: [AnyObject] = [
    Chemistry(علم الفيزياء: "علم الفيزياء الصلبة", معادلات: "هيرتز"),
    Maths(علم الفيزياء: "علم ديناميكا السوائل", معادلات: "جيجاهرتز"),
    Chemistry(علم الفيزياء: "علم الفيزياء الحرارية", معادلات: "ديسيبيل"),
    Maths(علم الفيزياء: "علم الفيزياء الكونية", معادلات: "تيراهرتز"),
    Maths(physics: "معادلات التفاضل والتكامل", formulae: "مجموعات جيبية")]
دعوة samplechem = Chemistry(physics: "مادة صلبة", equations: "هيرتز")
اطبع("نموذج الفيزياء هو: \(samplechem.physics)")
اطبع("نموذج المعادلة هو: \(samplechem.equations)")
دعوة samplemaths = Maths(physics: "ديناميكا السوائل", formulae: "تيراهرتز")
اطبع("نموذج الفيزياء هو: \(samplemaths.physics)")
اطبع("نموذج المعادلة هو: \(samplemaths.formulae)")
دعوة chemCount = 0
دعوة mathsCount = 0
للـ item في saprint {
    // شكل شروطي للتحويل
    إذا كان let show = item كـ? Chemistry {
        اطبع("موضوع الكيمياء هو: '\(show.physics)', \(show.equations)")
        // شكل قسري
    } آخره إذا كان let example = item كـ? Maths {
        اطبع("موضوع الرياضيات هو: '\(example.physics)', \(example.formulae)")
    }
}
دعوة exampleany = [Any]()
exampleany.append(12)
exampleany.append(3.14159)
exampleany.append("مثال أي")
exampleany.append(Chemistry(physics: "مادة صلبة", equations: "تيراهرتز"))
للـ item2 في exampleany {
    اختر item2 {
    حالة دعوة someInt كـ Int:
        اطبع("قيمة كاملة هي \(someInt)")
    حالة دعوة someDouble كـ Double حيث someDouble > 0:
        اطبع("قيمة بيتا هي \(someDouble)")
    حالة دعوة someString كـ String:
        print("\(someString)")
    case let phy as Chemistry:
        print("الموضوع '\(phy.physics)', \(phy.equations)")
    default:
        print("None")
    }
}

نتائج تنفيذ البرنامج أعلاه هي:

نموذج الفيزياء هو: ميكانيكا المواد الصلبة
نموذج المعادلة هو: هرتز
نموذج الفيزياء هو: ديناميكا السوائل
نموذج المعادلة هو: جيجاهرتز
الموضوع الكيمياء هو: 'ميكانيكا المواد الصلبة', هرتز
الموضوع الرياضيات هو: 'ديناميكا السوائل', جيجاهرتز
الموضوع الكيمياء هو: 'فيزياء الحرارة', ديسيبل
الموضوع الفيزياء هو: 'فيزياء الكواكب', ميجاهرتز
الموضوع الرياضيات هو: 'معادلات التفاضل والتكامل', السينوسية
قيمة العدد الصحيح هي 12
قيمة Pi هي 3.14159
مثال Any
الموضوع 'ميكانيكا المواد الصلبة', ميجاهرتز

استخدام محوول القوة في case من تعليمات switch لتحقق من التحويل إلى نوع واضح (استخدام as بدلاً من as?)