objective-c - swift 4.1 apple




سويفت readonly الخارجية ، readwrite الملكية الداخلية (2)

في Swift ، ما هي الطريقة التقليدية لتحديد النمط الشائع حيث تكون الخاصية قابلة للقراءة خارجيًا ، ولكن يمكن تعديلها داخليًا بواسطة الفئة (والفئات الفرعية) التي تمتلكها.

في Objective-C ، هناك الخيارات التالية:

  • قم بتعريف الخاصية كـ readonly في الواجهة واستخدم ملحق فئة للوصول إلى الخاصية داخليًا. هذا هو الوصول إلى الرسائل ، وبالتالي فهو يعمل بشكل جيد مع KVO ، atomicity ، إلخ.
  • قم بتعريف الخاصية للقراءة فقط في الواجهة ، ولكن الوصول إلى ivar backing داخليًا. وبما أن الوصول الافتراضي إلى ivar محمي ، فإن هذا يعمل بشكل جيد في التسلسل الهرمي للفئة ، حيث ستتمكن الفئات الفرعية أيضًا من تعديل القيمة ، ولكن هذا الحقل يكون للقراءة فقط.

في جاوا ، الاتفاقية هي:

  • قم بتعريف حقل محمي وقم بتطبيق getter عام (للقراءة فقط).

ما هو المصطلح الخاص بـ Swift؟


وفقًا لـAntonio ، يمكننا استخدام خاصية واحدة للوصول إلى قيمة الخاصية readWrite علنًا readWrite . في ما يلي رسالتي التوضيحية:

class MyClass {

    private(set) public var publicReadOnly: Int = 10

    //as below, we can modify the value within same class which is private access
    func increment() {
        publicReadOnly += 1
    }

    func decrement() {
        publicReadOnly -= 1
    }
}

let object = MyClass()
print("Initial  valule: \(object.publicReadOnly)")

//For below line we get the compile error saying : "Left side of mutating operator isn't mutable: 'publicReadOnly' setter is inaccessible"
//object.publicReadOnly += 1

object.increment()
print("After increment method call: \(object.publicReadOnly)")

object.decrement()
print("After decrement method call: \(object.publicReadOnly)")

وهنا الناتج:

  Initial  valule: 10
  After increment method call: 11
  After decrement method call: 10

بالنظر إلى خاصية الفئة ، يمكنك تحديد مستوى وصول مختلف عن طريق إدخال تعريف الخاصية مع معدِّل الوصول متبوعًا get أو set بين قوسين. على سبيل المثال ، سيتم الإعلان عن خاصية صنف بها حامل إيجار عام ومؤسسة خاصة:

private(set) public var readonlyProperty: Int

القراءة المقترحة: Getters and Setters

لا تزال اعتبارات مارتن حول مستوى إمكانية الوصول صالحة - أي لا يوجد معدِّل protected ، أو قيود internal على الوصول إلى الوحدة النمطية فقط ، أو private بالملف الحالي فقط ، public بدون قيود.

سويفت 3 مذكرات

تمت إضافة 2 من fileprivate الوصول الجديدة و fileprivate و open إلى اللغة ، في حين تم تعديل public بشكل طفيف:

  • ينطبق الافتتاح على أعضاء الصف والفصل فقط: يتم استخدامه للسماح لصف دراسي بأن يكون تحت فئة فرعية أو أن يتم تجاوز العضو خارج الوحدة النمطية حيث يتم تعريفهم. يجعل public الطبقة أو العضو في متناول الجميع ، ولكن ليس قابلاً للتوريث أو تجاوزه

  • private الآن يجعل العضو مرئيًا ويمكن الوصول إليه من الإعلان fileprivate فقط ، في حين أن fileprivate إلى الملف بأكمله حيث تم fileprivate

مزيد من التفاصيل here .





swift