Apa kata kunci 'terbuka' di Swift?

334

The ObjectiveC.swiftfile dari perpustakaan standar berisi beberapa baris kode berikut di sekitar baris 228:

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

Apa open varartinya dalam konteks ini, atau apa openkata kunci secara umum?

Clashsoft
sumber
2
Kemungkinan terkait: stackoverflow.com/questions/24003918/… ("Apa perbedaan antara opendan public?")
Ahmad F
Catatan sisi: kata kunci "terbuka" berasal dari konsep "terbuka untuk ekstensi, ditutup untuk modifikasi"
Sazzad Hissain Khan

Jawaban:

572

open adalah tingkat akses baru di Swift 3, yang diperkenalkan dengan implementasi

Ini tersedia dengan snapshot Swift 3 mulai 7 Agustus 2016, dan dengan Xcode 8 beta 6.

Pendeknya:

  • Sebuah openkelas dapat diakses dan subclassable luar modul mendefinisikan. Anggota openkelas dapat diakses dan ditimpa di luar modul pendefinisian.
  • Sebuah publickelas dapat diakses tetapi tidak subclassable luar modul mendefinisikan. Seorang publicanggota kelas dapat diakses tetapi tidak dapat ditimpa di luar modul pendefinisian.

Begitu openjuga yang publicdulu ada di rilis Swift sebelumnya dan akses publictelah dibatasi. Atau, seperti yang dikatakan Chris Lattner di SE-0177: Izinkan membedakan antara akses publik dan overridability publik :

"Open" sekarang hanya "lebih publik daripada publik", memberikan model yang sangat sederhana dan bersih.

Dalam contoh Anda, open var hashValueadalah properti yang dapat diakses dan dapat diganti dalam NSObjectsubkelas.

Untuk lebih banyak contoh dan detail, lihat di SE-0117 .

Martin R
sumber
16
Jadi publicdi Swift 3 seperti public finaldi Swift 2, dan openseperti public?
Clashsoft
16
@Clashsoft: "terbuka" di Swift 3 seperti "publik" di Swift 2. "publik" di Swift 3 tidak memiliki padanan dalam Swift 2. (Kelas terakhir tidak dapat disubklasifikasikan sama sekali, bahkan dalam modul yang sama.)
Martin R
59
Itu sangat berlawanan dengan intuisi. Terima kasih untuk ringkasannya.
GoldenJoe
7
Setuju dengan @MikeS, dan kurangnya kompatibilitas ke belakang membuat ini berantakan.
HughHughTeotl
14
@MikeS apple - berpikir berbeda, meskipun itu tidak perlu.
Varun Nath
12

Baca terbuka sebagai

terbuka untuk warisan dalam modul lain

Saya ulangi terbuka untuk warisan di modul lain. Jadi kelas terbuka terbuka untuk subklasifikasi dalam modul lain yang mencakup modul pendefinisian. Buka vars dan fungsi terbuka untuk mengganti modul lainnya. Level akses yang paling tidak membatasi. Sebaik akses publik menerima bahwa sesuatu yang bersifat publik ditutup untuk warisan dalam modul lain.

Dari Apple Documents :

Akses terbuka hanya berlaku untuk kelas dan anggota kelas, dan ini berbeda dari akses publik sebagai berikut:

  1. Kelas-kelas dengan akses publik, atau tingkat akses yang lebih membatasi, dapat disubklasifikasikan hanya dalam modul di mana mereka didefinisikan.

  2. Anggota kelas dengan akses publik, atau tingkat akses yang lebih membatasi, dapat ditimpa oleh subkelas hanya dalam modul di mana mereka didefinisikan.

  3. Kelas terbuka dapat disubklasifikasikan dalam modul di mana mereka didefinisikan, dan dalam modul apa pun yang mengimpor modul di mana mereka didefinisikan.

  4. Anggota kelas terbuka dapat ditimpa oleh subkelas dalam modul di mana mereka didefinisikan, dan dalam modul apa pun yang mengimpor modul di mana mereka didefinisikan.

Mohammad Sadiq
sumber
5

Terbuka adalah tingkat akses, diperkenalkan untuk memaksakan batasan pada kelas warisan pada Swift.

Ini berarti bahwa tingkat akses terbuka hanya dapat diterapkan ke kelas dan anggota kelas .

Di Kelas

Kelas terbuka dapat disubklasifikasikan dalam modul yang didefinisikan dan dalam modul yang mengimpor modul di mana kelas didefinisikan.

Di anggota kelas

Hal yang sama berlaku untuk anggota kelas. Metode terbuka dapat ditimpa oleh subkelas dalam modul itu didefinisikan dalam dan dalam modul yang mengimpor modul di mana metode didefinisikan.

KEBUTUHAN UPDATE INI

Beberapa kelas perpustakaan dan kerangka kerja tidak dirancang untuk disubklasifikasikan dan melakukan hal itu dapat mengakibatkan perilaku yang tidak terduga. Pustaka Apple asli juga tidak akan mengizinkan mengganti metode dan kelas yang sama,

Jadi setelah penambahan ini mereka akan menerapkan tingkat akses publik dan pribadi sesuai.

Untuk lebih jelasnya lihat di Apple Documentation on Access Control

Saranjith
sumber
1

Kecuali untuk subkelas, an open class funcjuga dapat diakses dari mana saja di proyek Anda. Katakanlah Anda mendefinisikan fungsi kelas terbuka di kelas Util Anda seperti ini

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

Kemudian di mana saja dari pengontrol tampilan Anda, Anda cukup mengakses metode ini dengan memanggil

Utils.printHello()
Fangming
sumber
3
Jawaban ini tidak menjelaskan apa bedanya dengan publik karena Anda juga bisa melakukannya dengan publik.
Jose Ramirez
Perlu penjelasan lebih lanjut tentang hal itu
MD Aslam Ansari
1

buka datang untuk bermain ketika berhadapan dengan banyak modul.

kelas terbuka dapat diakses dan subclassable di luar modul yang mendefinisikan. Anggota kelas terbuka dapat diakses dan ditimpa di luar modul pendefinisian.

Rajasekaran Gopal
sumber
0

open hanya untuk modul lain misalnya: cocoa pod, atau unit test, bisa kita warisi atau timpa

William
sumber