คำหลัก 'เปิด' ใน Swift คืออะไร


334

ObjectiveC.swiftไฟล์จากห้องสมุดมาตรฐานมีเพียงไม่กี่บรรทัดของรหัสต่อไปรอบ ๆ เส้น 228:

extension NSObject : Equatable, Hashable {
  /// ...
  open var hashValue: Int {
    return hash
  }
}

อะไรopen varหมายถึงในบริบทนี้หรือสิ่งที่เป็นopenคำหลักในทั่วไป?


2
อาจเกี่ยวข้อง: stackoverflow.com/questions/24003918/… ("ความแตกต่างระหว่างopenและpublicคืออะไร")
Ahmad F

หมายเหตุด้านข้าง: คำหลัก“ เปิด” มาจากแนวคิด“ เปิดเพื่อขยายปิดสำหรับการปรับเปลี่ยน”
Sazzad Hissain Khan

คำตอบ:


572

open เป็นระดับการเข้าถึงใหม่ใน Swift 3 ซึ่งได้รับการแนะนำให้รู้จักกับการปฏิบัติตาม

มันสามารถใช้ได้กับภาพรวม Swift 3 จาก 7 สิงหาคม 2016 และด้วย Xcode 8 เบต้า 6

ในระยะสั้น:

  • openชั้นสามารถเข้าถึงและsubclassableนอกกำหนดโมดูล openสมาชิกชั้นเรียนคือสามารถเข้าถึงและ overridableนอกกำหนดโมดูล
  • publicชั้นสามารถเข้าถึงได้แต่ไม่ subclassableนอกกำหนดโมดูล publicสมาชิกชั้นเรียนคือสามารถเข้าถึงได้แต่ ไม่ overridableนอกกำหนดโมดูล

ดังนั้นopenสิ่งที่publicเคยเป็นในรุ่นก่อนหน้าของ Swift และการเข้าถึงpublicถูก จำกัด หรือตามที่ Chris Lattner วางไว้ใน SE-0177: อนุญาตให้แยกความแตกต่างระหว่างการเข้าถึงสาธารณะและความสามารถในการระบายความร้อนสาธารณะ :

"เปิด" ตอนนี้เป็นเพียง "สาธารณะมากกว่าสาธารณะ" ให้รูปแบบที่ง่ายและสะอาด

ในตัวอย่างของคุณopen var hashValueเป็นคุณสมบัติที่สามารถเข้าถึงได้และสามารถแทนที่ได้ในNSObjectคลาสย่อย

สำหรับตัวอย่างและรายละเอียดเพิ่มเติมดูได้ที่SE-0117


16
ดังนั้นpublicใน Swift 3 เหมือนกับpublic finalใน Swift 2 และopenเป็นpublicอย่างไร
Clashsoft

16
@ Clashsoft: "open" ใน Swift 3 เหมือน "public" ใน Swift 2 "public" ใน Swift 3 นั้นไม่เทียบเท่ากับ Swift 2 (คลาสสุดท้ายไม่สามารถซับคลาสได้เลยแม้แต่ในโมดูลเดียวกัน)
Martin R

59
นั่นคือการต่อต้านอย่างชาญฉลาด ขอบคุณสำหรับบทสรุป
GoldenJoe

7
เห็นด้วยกับ @MikeS และการขาดความเข้ากันได้แบบย้อนหลังทำให้เรื่องนี้แย่มาก
HughHughTeotl

14
@MikeS apple - คิดแตกต่างแม้ว่าจะไม่จำเป็นก็ตาม
Varun Nath

12

เปิดอ่านเป็น

เปิดสำหรับการสืบทอดในโมดูลอื่น

ฉันเปิดซ้ำเพื่อรับมรดกในโมดูลอื่น ๆ ดังนั้นคลาสที่เปิดจึงเปิดสำหรับคลาสย่อยในโมดูลอื่นที่รวมถึงโมดูลที่กำหนด vars และฟังก์ชั่นเปิดจะเปิดขึ้นเพื่อแทนที่ในโมดูลอื่น ๆ ระดับการเข้าถึงที่ จำกัด อย่างน้อยที่สุด เป็นการดีเท่ากับการเข้าถึงสาธารณะยอมรับว่าบางสิ่งที่เป็นสาธารณะถูกปิดสำหรับการสืบทอดในโมดูลอื่น

จากApple เอกสาร :

การเข้าถึงแบบเปิดใช้เฉพาะกับคลาสและสมาชิกคลาสเท่านั้นและจะแตกต่างจากการเข้าถึงแบบสาธารณะดังนี้:

  1. คลาสที่มีการเข้าถึงแบบสาธารณะหรือระดับการเข้าถึงที่ จำกัด ยิ่งขึ้นสามารถแบ่งเป็นคลาสย่อยได้เฉพาะภายในโมดูลที่กำหนดไว้เท่านั้น

  2. สมาชิกของคลาสที่มีการเข้าถึงแบบสาธารณะหรือระดับการเข้าถึงที่ จำกัด สามารถถูกแทนที่ด้วยคลาสย่อยภายในโมดูลที่พวกมันถูกกำหนดไว้เท่านั้น

  3. คลาสที่เปิดสามารถ subclassed ภายในโมดูลที่พวกเขากำลังกำหนดและภายในโมดูลใด ๆ ที่นำเข้าโมดูลที่พวกเขากำลังกำหนด

  4. สมาชิกคลาสที่เปิดสามารถถูกแทนที่ด้วยคลาสย่อยภายในโมดูลที่พวกเขากำลังกำหนดและภายในโมดูลใด ๆ ที่นำเข้าโมดูลที่พวกเขากำลังกำหนด

5

Open เป็นระดับการเข้าถึงถูกนำมาใช้เพื่อกำหนดข้อ จำกัด เกี่ยวกับการสืบทอดคลาสบน Swift

ซึ่งหมายความว่าระดับการเข้าถึงแบบเปิดสามารถใช้ได้กับคลาสและสมาชิกคลาสเท่านั้น

ในชั้นเรียน

คลาสที่เปิดสามารถ subclassed ในโมดูลที่กำหนดไว้และในโมดูลที่นำเข้าโมดูลที่กำหนดระดับ

ในชั้นเรียนสมาชิก

เช่นเดียวกับสมาชิกชั้นเรียน วิธีการเปิดสามารถถูกแทนที่โดย subclasses ในโมดูลที่กำหนดไว้และในโมดูลที่นำเข้าโมดูลที่กำหนดวิธีการ

ความต้องการในการอัพเดทครั้งนี้

ไลบรารีและเฟรมเวิร์กบางคลาสไม่ได้รับการออกแบบมาให้มีคลาสย่อย ไลบรารีของ Apple ดั้งเดิมจะไม่อนุญาตให้แทนที่เมธอดและคลาสเดียวกัน

ดังนั้นหลังจากนี้พวกเขาจะใช้ระดับการเข้าถึงของรัฐและเอกชนตาม

สำหรับรายละเอียดเพิ่มเติมดูที่เอกสารของ Apple ในการควบคุมการเข้าถึง


1

ยกเว้นคลาสย่อยopen class funcสามารถเข้าถึงได้จากทุกที่ในโครงการของคุณ สมมติว่าคุณกำหนดฟังก์ชัน open class ในคลาส Util ของคุณเช่นนี้

open class Utils: NSObject {
    open class func printHello() {
        print("Hello from utils")
    }
}

จากนั้นในที่ใดก็ได้ของตัวควบคุมมุมมองของคุณคุณสามารถเข้าถึงวิธีนี้ได้โดยการโทร

Utils.printHello()

3
คำตอบนี้ไม่ได้อธิบายว่ามันแตกต่างจากสาธารณะเพราะคุณสามารถทำเช่นนั้นกับสาธารณะ
Jose Ramirez

ต้องการคำอธิบายเพิ่มเติมเกี่ยวกับเรื่องนี้
MD Aslam Ansari

1

เปิดมาเพื่อเล่นเมื่อจัดการกับหลายโมดูล

คลาสที่เปิดสามารถเข้าถึงได้และซับคลาสภายนอกโมดูลการกำหนด สมาชิกคลาสที่เปิดสามารถเข้าถึงได้และ overridable นอกโมดูลการกำหนด


0

เปิดเป็นเพียงสำหรับโมดูลอื่นเช่นฝักโกโก้หรือการทดสอบหน่วยเราสามารถสืบทอดหรือแทนที่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.