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?
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?
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:
Mulai dari Swift 4.0.3, anotasi @objc diperlukan jika Anda ingin menggunakan ekstensi dalam file kelas Objective C.
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:
CustomClass.h
CustomClass.m
CustomClassExtension.swift
Di CustomClassExtension:
@objc extension CustomClass
{
func method1()
{
...
}
}
Di AppDelegate.m saya:
self.customClass = [[CustomClass alloc] init];
[self.customClass method1];
@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.
import UIKit
extension UIColor {
//Custom colours
class func otherEventColor() -> UIColor {
return UIColor(red:0.525, green:0.49, blue:0.929, alpha:1)
}
}
Kemudian #import "ProductModuleName-Swift.h" di file ObjC Anda.
Cepat 4
extension UIColor {
// As of Swift 4.0.3, the @objc annotation is needed if you want to use the extension in Objective-C files
@objc
class func otherEventColor() -> UIColor {
return UIColor(red:0.525, green:0.49, blue:0.929, alpha:1)
}
}
public
dibutuhkan? Berfungsi dengan baik tanpa public
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 tidak NSString
). 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 dengan as String
) atau menentukan ekstensi untuk tipe Swift dan Objective-C.
public extension NSString
. Jika Anda mendapatkan pengenal yang belum terselesaikan atau kesalahan serupa pada waktu kompilasi, Anda dapat mentransmisikan kembali ke String misalnya let sVal = self as String
dan kemudian memanggil kode yang diperlukan disVal
mclaughlinj
dikatakan, untuk kelas NSString dan String struct