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 .