Jawaban terlambat lainnya, tetapi tidak ada jawaban yang ada pada pertanyaan ini yang benar-benar menjawab pertanyaan OP, yaitu: mengapa sih yang perlu Anda gunakan @objc
pada anggota private
kelas, jika @objc
ada untuk interaksi dengan Objective-C, dan anggota yang bersangkutan bersifat pribadi, artinya meskipun Anda memiliki kode Objective-C dalam proyek Anda, ia seharusnya tidak dapat melihat anggotanya?
Alasannya adalah, karena banyak framework yang ditulis di Objective-C, terkadang fitur Objective-C diperlukan untuk berinteraksi dengan API tertentu.
Misalnya, saya ingin mendaftar notifikasi melalui DistributedNotificationCenter
:
DistributedNotificationCenter.default.addObserver(self,
selector: #selector(somethingHappened(_:)),
name: someNotification,
object: nil)
Agar ini berfungsi, kita harus bisa mendapatkan pemilih untuk somethingHappened
metode tersebut. Namun, penyeleksi adalah konsep Objective-C, jadi jika metode tidak terlihat oleh Objective-C, itu tidak memiliki selector. Oleh karena itu, meskipun metode tersebut bersifat pribadi dan tidak boleh dipanggil oleh kode luar arbitrer, ia memerlukan @objc
agar DistributedNotification
kode, yang ditulis dalam Objective-C, dapat memanggilnya melalui selektornya.
Kasus umum lainnya @objc
yang diperlukan adalah untuk mendukung Key-Value Coding (KVC), terutama di macOS, di mana KVC dan KVO digunakan untuk mengimplementasikan Cocoa Bindings. KVC, seperti banyak sistem lain di Cocoa, diimplementasikan di Objective-C, yang memiliki efek mengharuskan properti yang sesuai dengan KVC diekspos ke runtime Objective-C. Terkadang, masuk akal jika properti yang sesuai dengan KVC bersifat pribadi. Salah satu contohnya adalah ketika Anda memiliki properti yang memengaruhi properti lain:
@objc private dynamic var originalProperty: String
@objc private static let keyPathsForValuesAffectingDependentProperty: Set<String> = [
#keyPath(originalProperty)
]
@objc public var dependentProperty: String { return changeItSomehow(self.originalProperty) }
Dalam hal ini, milik kita yang sebenarnya disimpan pribadi, tetapi milik tergantung, yang kita lakukan mengekspos kode luar, perlu mengirim pemberitahuan ketika properti pribadi diperbarui. Dengan menandai properti pribadi sebagai @objc
, kita dapat dengan mudah melakukannya dengan menyiapkan ketergantungan KVC — jika tidak, kita harus menulis kode untuk mengirim pemberitahuan secara manual di properti willSet
dan didSet
penangan pribadi. Selain itu, properti statis yang menginformasikan sistem KVC yang dependentProperty
bergantung pada originalProperty
perlu diekspos ke Objective-C sehingga sistem KVC menemukan dan memanggilnya, tetapi itu tidak relevan untuk klien kode kami.
Selain itu, pengontrol tampilan di app macOS yang memperbarui kontrol dalam tampilannya menggunakan Cocoa Bindings sebagai detail implementasi dapat membuat properti pribadi tertentu sesuai dengan KVC untuk mengikat kontrol tersebut ke properti tersebut.
Jadi seperti yang Anda lihat, ada kalanya metode atau properti perlu diekspos ke Objective-C untuk berinteraksi dengan kerangka kerja, tanpa harus terlihat oleh klien kode Anda.