English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
يمكن للتحويل النوعي في 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)") } }
نتائج تنفيذ البرنامج أعلاه هي:
نموذج الفيزياء هو: ميكانيكا المواد الصلبة نموذج المعادلة هو: هرتز نموذج الفيزياء هو: ديناميكا السوائل نموذج المعادلة هو: جيجاهرتز الموضوع الكيمياء هو: 'ميكانيكا المواد الصلبة', هرتز الموضوع الرياضيات هو: 'ديناميكا السوائل', جيجاهرتز الموضوع الكيمياء هو: 'فيزياء الحرارة', ديسيبل الموضوع الفيزياء هو: 'فيزياء الكواكب', ميجاهرتز الموضوع الرياضيات هو: 'معادلات التفاضل والتكامل', السينوسية
قدمت Swift نوعين خاصين من الaliases للنوع غير المعروف:
AnyObject
يمكن تمثيل أي مثال على class.Any
يمكنهما تمثيل أي نوع، بما في ذلك أنواع نوعي (function types).ملاحظة:
استخدمهما فقط عندما تحتاج إلى سلوكيات أو وظائف محددةAny
والAnyObject
فمن الأفضل دائمًا استخدام النوع المحدد الذي تتوقع استخدامه في شifrتك.
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 الموضوع 'ميكانيكا المواد الصلبة', ميجاهرتز
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?)