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 @objcpada anggota privatekelas, jika @objcada 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 somethingHappenedmetode 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 @objcagar DistributedNotificationkode, yang ditulis dalam Objective-C, dapat memanggilnya melalui selektornya.
Kasus umum lainnya @objcyang 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 willSetdan didSetpenangan pribadi. Selain itu, properti statis yang menginformasikan sistem KVC yang dependentPropertybergantung pada originalPropertyperlu 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.