إدراج ذاك تم إدخال كلمة مفتاح في Swift 5.1 تم تقديم كلمة مفتاح في Swift 5.6 ، الآن ، يمكن استخدام هذه الكلمات المفتاحية في المعايير الفعالة قبل تحديد نوع ، كما يلي: some any protocol P {} struct S: P {} // 'any P' is an explicit existential type. let p: any P = S() // 'some P' is an opaque type. let p: some P = S() func f(_ p: any P) {} func f(_ p: some P) {} في Swift 5 ، يمكن استخدام كلمات مفتاحية لتحديد نوع وجودي. بدءًا من Swift 6 ، يجب أن تكون أنواع وجودية مكتوبة بشكل واضح مع نوع وجودي. كلمات مفتاحية any any يساعد نوع غير قابل للتنبؤ على وصف نوع العودة المتوقع دون تحديد نوع الحديد المحدد، وبالتالي يمكن للمتداول الحصول على الوصول إلى معلومات النوع الحقيقي ويمكن إجراء تحسينات في هذا السياق. يمكن أن تخزين نوع وجودي أي قيمة تتوافق مع البروتوكول، ويمكن أن تتغير نوع القيمة بشكل ديناميكي، مما يتطلب توزيع الذاكرة الديناميكية. فهم بعض الكلمات الرئيسية يعتبر نوع النتيجة غير المباشر جزءاً أساسياً مقتبساً من التطبيق، لذلك يمكنك أن تفكر في هذا: some protocol P {} struct S1 : P {} func f() -> some P { return S1() } النقطة الأساسية هنا هي أن الوظيفة التي تنتج نوع يعود معيارًا خاصًا من نوعًا معينًا يرتبط بال إذا حاولت الفئة إعادة بعض أنواع التوافق المختلفة، فإن ذلك سيؤدي إلى خطأ المشترك، لأنه لا يمكن أن يتمكن المشترك العادي المتوافق مع أنواع متعددة. P P struct F1: P {} struct F2: P {} // error: Function declares an opaque return type, but the return // statements in its body do not have matching underlying types. func f(_ value: Bool) -> some P { if value { return F1() } else { return F2() } } دعونا نفكر في الفوائد التي تقدمها أنماط غير واضحة مقابل أنماط العودة البروتوكولية. Opaque result types can be used with PATs. The main limitation of using protocols is that protocols with associated types cannot be used as actual types. This means that the following code doesn’t compile: func collection() -> Collection { return ["1", "2", "3"] } As for opaque types, they are merely generic placeholders that can be used in such scenarios: // protocol Collection<Element> : Sequence func collection() -> some Collection { return ["1", "2", "3"] } Opaque result types have identity. Because opaque types guarantee that only one type will be returned, the compiler knows that a function must return the same type on several calls: func method() -> some Equatable { return "method" } let x = method() let y = method() print(x == y) // true Opaque result types compose with generic placeholders. Contrary to conventional protocol-typed values, opaque result types integrate effectively with standard generic placeholders. For instance: protocol P { var message: String { get } } struct M: P { var message: String } func makeM() -> some P { return M(message: "message") } func bar<T: P, U: P>(_ p1: T, _ p2: U) -> Bool { return p1.message == p2.message } let m1 = makeM() let m2 = makeM() print(bar(m1, m2)) However, it doesn’t work if make returns different types based on protocol . M() P protocol P { var message: String { get } } struct M: P { var message: String } struct T: P { var message: String } // error: function declares an opaque return type 'some P', but the return statements in its body do not have matching underlying types func makeM() -> some P { if .random() { return M(message: "M message") } else { return T(message: "T message") } } فهم أي كلمة مهمة دعونا نتعرف على النتائج التالية، دعونا نتعرف على المرسوم التاسع والعشرون من هذا المرسوم. Drawable protocol Drawable { func draw() } struct Line: Drawable { let x1: Int let y1: Int let x2: Int let y2: Int func draw() { print("Draw Line") } } struct Point: Drawable { let x: Int let y: Int func draw() { print("Point") } } لدينا اثنين من الأقمار الصناعية، و أولاً: إنشاء نوع من التغييرات وتخزينها الموضوع : Line Point Drawable var p1: any Drawable = Line(x1: 0, y1: 0, x2: 5, y2: 5) // 'any Drawable' is an explicit existential type p1.draw() // print "Draw Line" p1 = Point(x: 0, y: 0) p1.draw() // print "Point" يمكننا التبديل بين التطبيقات المختلفة خلال فترة التشغيل. دعونا نفكر في مثال آخر: let array: [any Drawable] = [ Line(x1: 0, y1: 0, x2: 5, y2: 5), Line(x1: 0, y1: 0, x2: 5, y2: 5), Point(x: 0, y: 0) ] كما نعلم، فإن الوصول إلى أي عنصر داخل مجموعة في وقت دائم ممكن لأن كل عنصر لديه حجم الذاكرة نفس.في مثالنا، حيث نقوم بتخزين عنصرين مختلفين، قد تتساءل كيف يمكننا الحصول على عنصر من مجموعة في مثل هذه الحالة. print(MemoryLayout<Line>.size) // 32 print(MemoryLayout<Point>.size) // 16 هذا ممكن لأنه ويعني أننا نعمل مع المكونات الإيمانية.في المكونات الإيمانية يغطي خمس كلمات آلية، وتخصيص ثلاثة لتخزين أي موضوع أو علامة على المكون، واحدة لتعريف على جدول الفيديو، والآخر لتعريف على جدول الشكاوى. any يحتوي المكون الإيجابي على 5 كلمات آلية (في نظام x64-bit، 5 * 8 = 40): Value buffer is a space for the instance VWT is a pointer to Value Witness Table PWT is a pointer to the Protocol Witness Table في كل مرة يتم استخدام قيمة بروتوكول في الكود، يقوم المؤلف بتنشيط حزمة ما نسميها حزمة حصرية. واحد حزمة لكل قيمة. لأنها يمكن تخزين أي قيمة تتوافق مع البروتوكول، ويمكن أن تتغير نوع القيمة المتوفرة بشكل ديناميكي، ويحتاج الحزمة الحالية إلى توزيع الذاكرة الديناميكية إذا كان القيمة غير صغيرة بما يكفي لتمتد إلى حزمة 3 كلمات آلية. بالإضافة إلى توزيع المجموعات ومقارنة المراجعة، تتضمن كل استخدام من محفظة وجودية إزالة الضوء والمراجعة الديناميكية، والتي لا يمكن تحسينها. يتم استخدام ثلاثة الكلمات في إدراج قيمة إذا كانت تتوافق مع 3 كلمات محمولة، أو إذا كانت قيمة أكثر من 3 كلمات محمولة، يتم إنشاء حافلة معالجة ARC. يتم تصفية القيمة إلى الحافلة، ثم يتم تصفية إشارة إلى الحافلة معالجة ARC إلى الكلمة الأولى من الحافلة. لا يتم استخدام الكلمات الستة المتبقية. يتم استخدام الكلمات التالية لتشير إلى جدول شهادة القيمة (VWT) و جدول شهادة البروتوكول (PWT) على التوالي. جدول شهادة البروتوكول هو مجموعة تحتوي على إحدى الوثائق لكل بروتوكول مرتبطة بشكل استثنائي مع النوع الإيجابي. إذا كان لدينا جدول شهادة البروتوكول (PWT) الذي يصف الامتثال من نوع إلى البروتوكول، يمكننا إنشاء مخزن وجودي، إرسالها، واستخدامها لتسليم ديناميكي. P & Q لذلك، لدينا حاوية وجودية، ونحن لدينا جدول شهادة البروتوكول. ومع ذلك، نحن لا نعرف أين يجب تخزين هذا القيمة في حاوية وجودية - ما إذا كان يتم تخزينها مباشرة في حاوية أو إذا كان لدينا فقط إشارة إلى القيمة في القاعة. ، ، ، كل نوع لديه جدول مثل هذا ، ويأخذ المسؤولية عن إنشاء مثال من النوع ، ويقرر أين يجب تخزين القيمة - في الكتلة أو في الكتلة ، وما إلى ذلك. allocate copy destruct deallocate الآن ، لدينا حاويات معقولة ، والتي تحل مشكلة انتقال المعايير من الحجم المتعدد ، وكيفية نقل هذه الحاويات. نعم، على الأقل، نريد أن نتمكن من استدعاء الأعضاء الضرورية من القيمة المتوفرة في المخزون، كما هو محدد في البروتوكول (المبادلات، الخصائص - سواء كانت متوفرة أو محددة، الوظائف، والتسجيلات). على سبيل المثال، قد يلجأ بعض الأشخاص إلى تلبية متطلبات الطريقة عن طريق تحديدها مباشرة، في حين قد يلجأ آخرون، على سبيل المثال، إلى فئة، إلى التلبية عن طريق الترويج عن الطريقة من فئة فوقية. التعامل مع كل هذا التنوع هو الهدف الرئيسي من جدول شهادة البروتوكول (PWT). هناك مثلًا جدول واحد من هذا النوع لكل ترتيب البروتوكول. على الرغم من أن الوظائف قد تقع في أماكن مختلفة ، إلا أن موقع PWT هو فريدة من نوعها بالنسبة إلى البروتوكول الذي يتوافق معه. من المهم أن نعرف أن الأقمار الاصطناعية تكلفة نسبياً لاستخدامها لأن الكمبيوتر والمرور لا يستطيع تحديد مسبقاً كم من الذاكرة يجب تخصيصها لمواقع الحيوية التي ستملأ القمر. من المهم أن نعرف أن الأقمار الاصطناعية تكلفة نسبياً لاستخدامها لأن الكمبيوتر والمرور لا يستطيع تحديد مسبقاً كم من الذاكرة يجب تخصيصها لمواقع الحيوية التي ستملأ القمر. خلاصة ونحن نلاحظ الفرق بين و من ناحية اخرى ، فقد تحسن بشكل كبير معالجة ووصف الكود الكلي لدينا ، من ناحية اخرى ، فقد قدمنا طرق جديدة لتصنيع الكود الكلي بطريقة أكثر فعالية. some any شكرا على القراءة