Saya mencoba mengubah beberapa kelas Obj-C saya menjadi Swift. Dan beberapa kelas Obj-C lainnya masih menggunakan enum di kelas yang dikonversi. Saya mencari di Dokumen Pra-Rilis dan tidak dapat menemukannya atau mungkin saya melewatkannya. Apakah ada cara untuk menggunakan Swift enum di Obj-C Class? Atau tautan ke dokumen masalah ini?
Ini adalah bagaimana saya mendeklarasikan enum saya dalam kode Obj-C lama dan kode Swift baru saya.
Kode Obj-C lama saya:
typedef NS_ENUM(NSInteger, SomeEnum)
{
SomeEnumA,
SomeEnumB,
SomeEnumC
};
@interface SomeClass : NSObject
...
@end
Kode Swift baru saya:
enum SomeEnum: NSInteger
{
case A
case B
case C
};
class SomeClass: NSObject
{
...
}
Pembaruan: Dari jawaban. Itu tidak dapat dilakukan dalam versi Swift yang lebih lama dari 1.2. Namun menurut Swift Blog resmi ini . Di Swift 1.2 yang dirilis bersama dengan XCode 6.3, Anda dapat menggunakan Swift Enum di Objective-C dengan menambahkan @objc
di depanenum
objective-c
enums
swift
myLifeasdog
sumber
sumber
Jawaban:
Pada Swift versi 1.2 (Xcode 6.3) Anda bisa. Cukup awali deklarasi enum dengan
@objc
Tanpa malu-malu diambil dari Blog Swift
Dalam Objective-C ini akan terlihat seperti
sumber
BearBlack
,BearGrizzly
danBearPolar
!Untuk memperluas jawaban yang dipilih ...
Dimungkinkan untuk berbagi enum gaya Swift antara Swift dan Objective-C menggunakan
NS_ENUM()
.Mereka hanya perlu didefinisikan dalam konteks Objective-C menggunakan
NS_ENUM()
dan mereka tersedia menggunakan notasi Swift dot.Dari Swift Menggunakan dengan Kakao dan Objective-C
Objektif-C
Cepat
sumber
if let a = MyEnum(rawValue: 12345)
mana 12345 bukan bagian dari enum itu, hasilnya bukan opsional tetapi beberapa enum tidak valid.Dari Panduan Menggunakan Swift dengan Kakao dan Objective-C :
Jadi, tidak, Anda tidak bisa menggunakan Swift enum di kelas Objective-C.
sumber
@objc
seperti yang ditunjukkan @DanielGalasko dalam jawabannya di bawah ini !!!@obj enum MyEnum: Int
dalamnya akan berfungsi dengan baik pada file Objective-C seperti yang disebutkan sebelumnya. Jika enum Anda dideklarasikan dengan tipe nilai mentah lain seperti@obj enum MyOtherEnum: String
, Anda tidak akan dapat menggunakannya pada file Objective-CSwift 4.1, Xcode 9.4.1:
1) Swift enum harus diawali dengan
@objc
danInt
ketik:2) Nama Objective-C adalah nama enum + nama kasus, misalnya
CalendarPermissionAuthorized
:Dan, tentu saja, ingatlah untuk mengimpor header bridging Swift Anda sebagai item terakhir dalam daftar impor file Objective-C:
sumber
Jika Anda lebih suka mempertahankan kode ObjC apa adanya, Anda bisa menambahkan file header pembantu di proyek Anda:
dalam file header tambahkan jenis enum ini:
Mungkin ada tempat lain di file .m Anda untuk membuat perubahan: untuk memasukkan file header tersembunyi:
ganti [NamaProyek] dengan nama proyek Anda. File header ini memperlihatkan semua kelas @objc yang ditentukan Swift, sebelum ke ObjC.
Anda mungkin mendapatkan pesan peringatan tentang konversi implisit dari jenis enumerasi ... Tidak masalah.
Ngomong-ngomong, Anda bisa menggunakan file pembantu header ini untuk menyimpan beberapa kode ObjC seperti konstanta #define.
sumber
Jika Anda (seperti saya) benar-benar ingin menggunakan String enums, Anda dapat membuat antarmuka khusus untuk tujuan-c. Sebagai contoh:
Tentu saja, ini tidak akan memberi Anda kenyamanan pelengkapan otomatis (kecuali jika Anda menetapkan konstanta tambahan di lingkungan objektif-c).
sumber
ini mungkin sedikit membantu
Pernyataan masalah : - Saya memiliki enum di kelas cepat, yang saya akses dari kelas cepat lainnya, dan Sekarang saya perlu mengaksesnya dari salah satu kelas C objektif saya.
Sebelum mengaksesnya dari kelas objektif-c: -
Perubahan untuk mengaksesnya dari kelas objektif c
dan menambahkan fungsi untuk meneruskannya pada nilai
sumber
Setelah meneliti ini, saya terus menemukan hanya sebagian jawaban, jadi saya membuat seluruh contoh aplikasi Swift yang dijembatani ke Objective C yang memiliki Swift enum yang digunakan oleh kode Objective C dan Objective C enum yang digunakan oleh kode Swift. Ini adalah proyek Xcode sederhana yang dapat Anda jalankan dan coba. Itu ditulis menggunakan Xcode 10.3 dengan Swift 5.0
Contoh Proyek
sumber
enum SwAnimal
tidak memiliki yang terdepan@obj
Jika Anda mencoba mengamati enum yang terlihat seperti ini:
solusi ini membantu saya.
Kelas yang Dapat Diobservasi:
@objc dynamic var observable: String?
buat instance enum Anda seperti ini:
Kelas Pengamat:
private var _enumName: EnumName?
private let _instance = ObservableClass()
membuat
Dari pada itu. Sekarang setiap kali Anda mengubah
_enumName
di kelas yang dapat diamati, contoh yang sesuai pada kelas pengamat akan segera diperbarui juga.Ini tentu saja merupakan implementasi yang terlalu disederhanakan, tetapi harus memberi Anda gambaran tentang bagaimana mengamati properti yang tidak kompatibel dengan KVO.
sumber