Saya mencari beberapa posting, saya pikir saya tidak dapat menulis ekstensi di bawah swift, dan menyebutnya dari kode Objective-C, bukan?
@objc seperti atribut hanya mendukung metode, kelas, protokol?
objective-c
swift
swift-extensions
sprhawk
sumber
sumber
Jawaban:
Anda dapat menulis ekstensi Swift dan menggunakannya dalam kode Objective-C. Diuji dengan XCode 6.1.1.
Yang perlu Anda lakukan hanyalah:
buat ekstensi Anda di Swift (tanpa
@objc
anotasi)#import "ProjectTarget-Swift.h"
di kelas Objective-C Anda (di mana "ProjectTarget" mewakili target XCode yang terkait dengan ekstensi Swift)memanggil metode dari ekstensi Swift
Pembaruan: Seperti yang disebutkan @Rizwan Ahmed, Anda perlu menambahkan
@objc
anotasi:sumber
Saya menemukan bahwa di Swift 4.0 saya harus menambahkan
@objc
di depan kata kunci ekstensi saya agar metode ekstensi Swift menjadi terlihat oleh contoh kelas Objc yang saya perluas.Pendeknya:
Pengaturan konfigurasi file:
Di CustomClassExtension:
Di AppDelegate.m saya:
sumber
@nonobjc
anotasi.Solusi ini berfungsi untuk Swift 2.2 dan Swift 3 . Perhatikan bahwa hanya ekstensi untuk kelas (bukan untuk struct atau enum) yang dapat diakses dari Objective-C.
Kemudian #import "ProductModuleName-Swift.h" di file ObjC Anda.
Cepat 4
sumber
public
dibutuhkan? Berfungsi dengan baik tanpapublic
pengubah untuk saya. Apakah kita mengasumsikan bahwa ekstensi tersebut tidak ada dalam proyek yang sama tetapi diimpor dari proyek lain?Seperti yang tercakup dalam jawaban lain, mengimpor tajuk Swift yang dihasilkan berfungsi dalam banyak kasus .
Pengecualian untuk ini adalah ketika kategori didefinisikan pada tipe yang dijembatani (yaitu ekstensi didefinisikan pada
String
dan tidakNSString
). Kategori ini tidak akan secara otomatis dihubungkan ke rekan Objective-C mereka. Untuk menyiasatinya, Anda harus menggunakan tipe Objective-C (dan memasukkan nilai yang dikembalikan dalam kode Swift Anda denganas String
) atau menentukan ekstensi untuk tipe Swift dan Objective-C.sumber
public extension NSString
. Jika Anda mendapatkan pengenal yang belum terselesaikan atau kesalahan serupa pada waktu kompilasi, Anda dapat mentransmisikan kembali ke String misalnyalet sVal = self as String
dan kemudian memanggil kode yang diperlukan disVal
mclaughlinj
dikatakan, untuk kelas NSString dan String structImpor header "#import" ProductModuleName-Swift.h " di file objektif-c dan tambahkan @objc di depan ekstensi Anda di file swift. Ini akan berfungsi dengan baik di Swift 4.2 dan Swift 5
sumber