Dalam Objective-C instance data dapat berupa public
, protected
atau private
. Sebagai contoh:
@interface Foo : NSObject
{
@public
int x;
@protected:
int y;
@private:
int z;
}
-(int) apple;
-(int) pear;
-(int) banana;
@end
Saya belum menemukan penyebut akses yang disebutkan dalam referensi Swift. Apakah mungkin membatasi visibilitas data di Swift?
access-modifiers
swift
Gergo Erdosi
sumber
sumber
Jawaban:
Pada Swift 3.0.1 , ada 4 tingkat akses , dijelaskan di bawah ini dari yang tertinggi (paling ketat) hingga terendah (paling ketat).
1.
open
danpublic
Aktifkan entitas untuk digunakan di luar modul penentu (target). Anda biasanya menggunakan
open
ataupublic
mengakses ketika menentukan antarmuka publik untuk suatu kerangka kerja.Namun,
open
akses hanya berlaku untuk kelas dan anggota kelas , dan itu berbeda daripublic
akses sebagai berikut:public
kelas dan anggota kelas hanya dapat disubklasifikasikan dan diganti dalam modul pendefinisian (target).open
kelas dan anggota kelas dapat disubklasifikasikan dan diganti baik di dalam maupun di luar modul (target).2.
internal
Memungkinkan entitas untuk digunakan dalam modul yang menentukan (target). Anda biasanya menggunakan
internal
akses saat mendefinisikan struktur internal aplikasi atau kerangka kerja.3.
fileprivate
Membatasi penggunaan entitas untuk file sumber yang menentukan. Anda biasanya menggunakan
fileprivate
akses untuk menyembunyikan detail implementasi dari bagian fungsionalitas tertentu ketika detail itu digunakan dalam seluruh file.4.
private
Membatasi penggunaan suatu entitas pada deklarasi terlampir. Anda biasanya menggunakan
private
akses untuk menyembunyikan detail implementasi dari bagian fungsionalitas tertentu ketika detail tersebut hanya digunakan dalam satu deklarasi.sumber
Swift 4 / Swift 5
Seperti yang disebutkan dalam Dokumentasi Swift - Kontrol Akses , Swift memiliki 5 Kontrol Akses :
buka dan publik : dapat diakses dari entitas modul mereka dan entitas modul apa pun yang mengimpor modul yang menentukan.
intern : hanya dapat diakses dari entitas modul mereka. Ini adalah tingkat akses standar.
fileprivate dan pribadi : hanya dapat diakses secara terbatas dalam ruang lingkup terbatas di mana Anda mendefinisikannya.
Apa perbedaan antara terbuka dan publik ?
terbuka sama dengan publik pada versi Swift sebelumnya, mereka memungkinkan kelas dari modul lain untuk menggunakan dan mewarisinya, yaitu: mereka dapat disubkelas dari modul lain. Juga, mereka memungkinkan anggota dari modul lain untuk menggunakan dan menimpanya. Logika yang sama berlaku untuk modul mereka.
publik mengizinkan kelas dari modul lain untuk menggunakannya, tetapi tidak mewarisi mereka, yaitu: mereka tidak dapat subkelas dari modul lain. Juga, mereka memungkinkan anggota dari modul lain untuk menggunakannya, tetapi TIDAK untuk menimpanya. Untuk modul mereka, mereka memiliki logika open yang sama (mereka memungkinkan kelas untuk menggunakan dan mewarisinya; Mereka memungkinkan anggota untuk menggunakan dan menimpanya).
Apa perbedaan antara fileprivate dan privat ?
fileprivate dapat diakses dari seluruh file mereka.
pribadi hanya dapat diakses dari deklarasi tunggal mereka dan ke ekstensi deklarasi yang ada di file yang sama; Misalnya:
Apa perbedaan antara Kontrol Akses Swift 3 dan Swift 4?
Seperti yang disebutkan dalam proposal SE-0169 , satu-satunya penyempurnaan telah ditambahkan ke Swift 4 adalah bahwa ruang lingkup kontrol akses pribadi telah diperluas agar dapat diakses dari ekstensi deklarasi tersebut dalam file yang sama; Misalnya:
Jadi, tidak perlu menyatakan
myMessage
sebagai fileprivate untuk dapat diakses di seluruh file.sumber
Ketika seseorang berbicara tentang membuat "metode pribadi" di Swift atau ObjC (atau ruby atau java atau ...) metode tersebut tidak benar - benar pribadi. Tidak ada kontrol akses aktual di sekitar mereka. Bahasa apa pun yang menawarkan bahkan sedikit introspeksi memungkinkan pengembang mencapai nilai-nilai itu dari luar kelas jika mereka benar-benar menginginkannya.
Jadi apa yang sebenarnya kita bicarakan di sini adalah cara untuk mendefinisikan antarmuka publik yang hanya menyajikan fungsi yang kita inginkan, dan "menyembunyikan" sisanya yang kita anggap "pribadi".
Mekanisme Swift untuk mendeklarasikan antarmuka adalah
protocol
, dan dapat digunakan untuk tujuan ini.Ingat, protokol adalah tipe kelas satu dan bisa digunakan di mana saja. Dan , ketika digunakan dengan cara ini, mereka hanya mengekspos antarmuka mereka sendiri, bukan dari tipe implementasi.
Jadi, selama Anda menggunakan dan
MyClass
bukanMyClassImplementation
pada tipe parameter Anda, dll. Itu semua hanya akan berfungsi:Ada beberapa kasus penugasan langsung di mana Anda harus eksplisit dengan tipe alih-alih mengandalkan Swift untuk menyimpulkannya, tetapi itu sepertinya bukan pemecah kesepakatan:
Menggunakan protokol dengan cara ini semantik, cukup ringkas, dan bagi saya sangat mirip dengan Kelas Extentions yang telah kami gunakan untuk tujuan ini di ObjC.
sumber
Sejauh yang saya tahu, tidak ada kata kunci 'publik', 'pribadi' atau 'dilindungi'. Ini akan menyarankan semuanya bersifat publik.
Namun Apple mungkin mengharapkan orang untuk menggunakan " protokol " (disebut antarmuka oleh seluruh dunia) dan pola desain pabrik untuk menyembunyikan detail dari jenis implementasi.
Ini sering merupakan pola desain yang baik untuk digunakan; karena memungkinkan Anda mengubah hierarki kelas implementasi Anda , sambil menjaga sistem tipe logis yang sama.
sumber
Menggunakan kombinasi protokol, penutupan, dan kelas bersarang / dalam, dimungkinkan untuk menggunakan sesuatu di sepanjang garis pola modul untuk menyembunyikan informasi di Swift sekarang. Ini tidak super bersih atau enak dibaca tetapi tidak berfungsi.
Contoh:
innerVal dan misteriusMath disembunyikan di sini dari penggunaan luar dan berusaha menggali jalan Anda ke objek harus menghasilkan kesalahan.
Saya hanya bagian dari jalan saya membaca Swift docs jadi jika ada cacat di sini tolong tunjukkan, ingin tahu.
sumber
reflect(h)[0].1.value // 19
Pada Xcode 6 beta 4, Swift memiliki pengubah akses. Dari catatan rilis:
Default tersirat adalah
internal
, jadi dalam target aplikasi Anda dapat mematikan pengubah akses kecuali di mana Anda ingin lebih membatasi. Dalam target kerangka kerja (misalnya jika Anda menyematkan kerangka kerja untuk berbagi kode antara aplikasi dan berbagi atau ekstensi tampilan Hari Ini), gunakanpublic
untuk menunjuk API yang ingin Anda paparkan ke klien kerangka kerja Anda.sumber
Swift 3.0 menyediakan lima kontrol akses yang berbeda:
Tingkat Akses Default
Semua entitas dalam kode Anda (dengan beberapa pengecualian spesifik) memiliki tingkat akses standar internal jika Anda tidak menentukan sendiri tingkat akses eksplisit. Akibatnya, dalam banyak kasus Anda tidak perlu menentukan tingkat akses eksplisit dalam kode Anda.
Catatan rilis pada topik:
Informasi lebih lanjut & detail: Bahasa Pemrograman Swift (Kontrol Akses)
sumber
Dalam Beta 6, dokumentasi menyatakan bahwa ada tiga pengubah akses yang berbeda:
Dan ketiganya berlaku untuk Kelas, Protokol, fungsi dan properti.
Untuk lebih lanjut, periksa Kontrol Akses .
sumber
Sekarang dalam versi beta 4, mereka telah menambahkan pengubah akses ke Swift.
dari Xcode 6 beta 4 catatan nyata :
sumber
Mekanisme kontrol akses sebagai diperkenalkan pada Xcode 6 :
Default mengaksesnya internal , dan tidak perlu ditentukan. Perhatikan juga bahwa specifier pribadi tidak berfungsi pada level kelas, tetapi pada level file sumber. Ini berarti bahwa untuk mendapatkan bagian dari kelas yang benar-benar pribadi Anda perlu memisahkan ke dalam file sendiri. Ini juga memperkenalkan beberapa kasus menarik berkaitan dengan pengujian unit ...
Hal lain yang saya sampaikan, yang dikomentari di tautan di atas, adalah Anda tidak dapat 'meningkatkan' tingkat akses. Jika Anda mensubklasifikasikan sesuatu, Anda dapat membatasi lebih banyak, tetapi tidak sebaliknya.
Bit terakhir ini juga memengaruhi fungsi, tupel, dan tentunya hal-hal lain dengan cara jika jika suatu fungsi menggunakan kelas privat , maka tidak valid untuk memiliki fungsi internal atau publik , karena mereka mungkin tidak memiliki akses ke kelas privat . Ini menghasilkan peringatan kompiler, dan Anda harus mendeklarasikan ulang fungsi sebagai fungsi pribadi .
sumber
Swift 3 dan 4 membawa banyak perubahan juga untuk tingkat akses variabel dan metode. Swift 3 dan 4 sekarang memiliki 4 tingkat akses yang berbeda, di mana akses terbuka / publik adalah tingkat akses tertinggi (paling ketat) dan akses pribadi adalah tingkat akses terendah (paling ketat):
Menarik:
Alih-alih menandai setiap metode atau anggota sebagai "pribadi", Anda dapat membahas beberapa metode (misalnya fungsi pembantu) dalam ekstensi kelas / struct dan tandai seluruh ekstensi sebagai "Pribadi".
Ini bisa menjadi ide yang bagus, untuk mendapatkan kode yang bisa dikelola lebih baik. Dan Anda dapat dengan mudah beralih (misalnya untuk pengujian unit) ke non-pribadi hanya dengan mengubah satu kata.
Dokumentasi Apple
sumber
Untuk Swift 1-3:
Tidak, itu tidak mungkin. Tidak ada metode dan variabel pribadi / yang dilindungi sama sekali.
Semuanya bersifat publik.
Pembaruan Sejak Swift 4, dimungkinkan melihat jawaban lain di utas ini
sumber
Salah satu opsi yang bisa Anda gunakan adalah untuk membungkus kreasi instance ke dalam fungsi dan memasok getter dan setters yang sesuai dalam sebuah konstruktor:
sumber
Tata bahasa tidak memiliki kata kunci 'publik', 'pribadi' atau 'dilindungi'. Ini akan menyarankan semuanya bersifat publik. Tentu saja, mungkin ada beberapa metode alternatif untuk menentukan pengubah akses tanpa kata kunci tersebut tetapi saya tidak dapat menemukannya dalam referensi bahasa.
sumber
Semoga menghemat waktu bagi mereka yang menginginkan sesuatu yang mirip dengan metode yang dilindungi:
Sebagai jawaban lain, swift sekarang menyediakan pengubah 'pribadi' - yang didefinisikan berdasarkan file daripada kelas-bijaksana seperti yang ada di Jawa atau C # misalnya. Ini berarti bahwa jika Anda ingin metode yang dilindungi, Anda dapat melakukannya dengan metode pribadi cepat jika mereka berada di file yang sama
mis. File 1:
File 2:
}
sumber
https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/AccessControl.html#//apple_ref/doc/uid/TP40014097-CH41-ID3
MULAI SWIFT 2.2;)
Secara default Internal
sumber
sampai swift 2.0 hanya ada tiga tingkat akses [Publik, internal, swasta] tetapi di apple cepat Swift 3.0 menambahkan dua tingkat akses baru yaitu [Buka, fileType] jadi sekarang di swift 3.0 ada 5 tingkat akses Di sini saya ingin menghapus peran dari dua tingkat akses ini 1. Buka: ini sangat mirip dengan Publik tetapi satu-satunya perbedaan adalah bahwa Publik dapat mengakses subclass dan menimpanya, dan tingkat akses Terbuka tidak dapat mengakses bahwa gambar ini diambil dari situs web Medium dan ini menggambarkan perbedaannya antara akses terbuka dan publik
Sekarang ke level akses baru kedua 2. filetype adalah versi yang lebih besar dari privat atau level akses yang kurang dari internal FileType dapat mengakses bagian [class, struct, enum] yang diperluas dan privat tidak dapat mengakses bagian kode yang diperluas, hanya bisa mengakses lingkup leksikal gambar ini diambil dari situs web Medium dan ini menggambarkan perbedaan antara fileType dan tingkat akses Privat
sumber