Di Objective-C, pemberitahuan khusus hanyalah NSString biasa, tetapi tidak jelas dalam versi WWDC dari Swift 3 apa yang seharusnya.
112
Di Objective-C, pemberitahuan khusus hanyalah NSString biasa, tetapi tidak jelas dalam versi WWDC dari Swift 3 apa yang seharusnya.
Jawaban:
Anda juga bisa menggunakan protokol untuk ini
Dan kemudian tentukan nama notifikasi Anda sebagai
enum
mana pun yang Anda inginkan. Sebagai contoh:Dan gunakan seperti itu
Dengan cara ini nama notifikasi akan dipisahkan dari Foundation
Notification.Name
. Dan Anda hanya perlu memodifikasi protokol Anda jika adaNotification.Name
perubahan implementasi .sumber
NotificationName
sehingganame
properti hanya ditambahkan ke enum yang sesuai dengan protokol.extension NotificationName where Self: RawRepresentable, Self.RawValue == String {
Ada cara yang lebih bersih (menurut saya) untuk mencapainya
Dan kemudian Anda bisa menggunakannya seperti ini
sumber
extension NSNotification.Name
bukannyaextension Notification.Name
. Jika tidak, Swift 3 mengeluh dengan'Notification' is ambiguous for type lookup in this context
Notification.post didefinisikan sebagai:
Di Objective-C, nama notifikasi adalah NSString biasa. Di Swift, ini didefinisikan sebagai NSNotification.Name.
NSNotification.Name didefinisikan sebagai:
Ini agak aneh, karena saya berharap itu menjadi Enum, dan bukan beberapa struct kustom dengan manfaat yang tampaknya tidak lebih.
Ada typealias di Notification for NSNotification.Name:
Bagian yang membingungkan adalah Notification dan NSNotification ada di Swift
Jadi untuk menentukan notifikasi kustom Anda sendiri, lakukan sesuatu seperti:
Kemudian menyebutnya:
sumber
Notification.Name
merupakan enum, tidak ada yang dapat menentukan notifikasi baru. Kami menggunakan struct untuk tipe sebaliknya-enum yang perlu mengizinkan penambahan anggota baru. (Lihat proposal evolusi-cepat .)Notification
merupakan tipe nilai (struct), sehingga dapat memanfaatkan semantik Swift untuk nilai (im) mutabilitas. Umumnya, jenis Fondasi menghilangkan "NS" mereka di Swift 3, tetapi di mana salah satu Jenis Nilai Fondasi baru ada untuk menggantikannya, jenis referensi lama tetap ada (tetap menggunakan nama "NS") sehingga Anda masih dapat menggunakannya saat Anda memerlukan semantik referensi atau untuk membuat subkelasnya. Lihat proposalnya .Cara yang lebih mudah:
sumber
Anda dapat menambahkan penginisialisasi khusus ke NSNotification.Name
Pemakaian:
sumber
case
s dalam enum yang harus dikecilkan , bukan enum itu sendiri. Nama tipe diberi huruf besar, dan enum adalah tipe.Saya mungkin menyarankan opsi lain yang mirip dengan apa yang disarankan @CesarVarela.
Ini akan memungkinkan Anda memposting dan berlangganan pemberitahuan dengan mudah.
Semoga ini bisa membantu Anda.
sumber
Saya melakukan implementasi saya sendiri dengan mencampur berbagai hal dari sana dan di sana, dan menemukan ini sebagai yang paling nyaman. Berbagi untuk siapa saja yang mungkin tertarik:
sumber
sumber
Ini hanya referensi
sumber
Keuntungan menggunakan enum adalah kita meminta kompiler untuk memeriksa apakah namanya benar. Mengurangi potensi masalah dan mempermudah pemfaktoran ulang.
Bagi mereka yang suka menggunakan enum daripada kutipan string untuk nama notifikasi, kode ini melakukan triknya:
Kemudian Anda bisa menggunakannya seperti ini:
Meskipun tidak terkait dengan pertanyaan, hal yang sama dapat dilakukan dengan segmen storyboard, untuk menghindari mengetik string yang dikutip:
Kemudian, pada pengontrol tampilan Anda, sebut seperti:
sumber
NotificationCenter.default.post(.somethingHappened)
Ini melempar kesalahan; metode yang Anda tambahkan di ekstensi menerima lebih banyak argumen.jika Anda menggunakan notifikasi khusus khusus string, tidak ada alasan untuk memperluas kelas apa pun kecuali
String
sumber
Jawaban @ CesarVarela bagus, tetapi untuk membuat kodenya sedikit lebih bersih, Anda dapat melakukan hal berikut:
sumber
Jika Anda ingin ini bekerja dengan bersih dalam proyek yang menggunakan Objective-C dan Swift pada saat yang sama, menurut saya akan lebih mudah untuk membuat notifikasi di Objective-C.
Buat file .m / .h:
Di Anda
MyProject-Bridging-Header.h
(dinamai menurut proyek Anda) untuk mengekspos mereka ke Swift.Gunakan notifikasi Anda di Objective-C seperti ini:
Dan di Swift (5) seperti ini:
sumber