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 @objcanotasi)
#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 @objcanotasi:
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 @objcdi 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];
@nonobjcanotasi.
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)
}
}
publicdibutuhkan? Berfungsi dengan baik tanpa publicpengubah 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 Stringdan 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 Stringdan kemudian memanggil kode yang diperlukan disVal
mclaughlinjdikatakan, untuk kelas NSString dan String struct