Bazı gönderileri araştırdım, sanırım hızlı bir uzantı yazıp Objective-C kodundan arayamam, değil mi?
@objc gibi öznitelikler yalnızca yöntemleri, sınıfı, protokolleri destekliyor mu?
Bazı gönderileri araştırdım, sanırım hızlı bir uzantı yazıp Objective-C kodundan arayamam, değil mi?
@objc gibi öznitelikler yalnızca yöntemleri, sınıfı, protokolleri destekliyor mu?
Yanıtlar:
Bir Swift eklentisi yazıp bunu Objective-C kodunda kullanabilirsiniz. XCode 6.1.1 ile test edilmiştir.
Yapmanız gereken tek şey:
uzantınızı Swift'de oluşturun ( @objc
açıklama yok )
#import "ProjectTarget-Swift.h"
Objective-C sınıfınızda (burada "ProjectTarget", Swift uzantısının ilişkilendirildiği XCode hedefini temsil eder)
Swift uzantısından yöntemleri çağırın
Güncelleme:
@Rizwan Ahmed'in bahsettiği gibi, @objc
ek açıklama eklemeniz gerekiyor :
Swift 4.0.3'ten itibaren, uzantıyı Objective C sınıfı dosyalarında kullanmak istiyorsanız @objc ek açıklaması gereklidir.
Ben de öğrendim Swift 4.0 ben eklemek zorunda @objc
benim önünde uzatma ı uzatılacağı objc sınıfının bir örneği tarafından görünür hale Swift uzatma yöntemleri için sırayla anahtar kelime.
Kısacası:
Dosya yapılandırma kurulumu:
CustomClass.h
CustomClass.m
CustomClassExtension.swift
CustomClassExtension'da:
@objc extension CustomClass
{
func method1()
{
...
}
}
AppDelegate.m'de:
self.customClass = [[CustomClass alloc] init];
[self.customClass method1];
@nonobjc
ek açıklamayı eklemeniz gerekir .
Bu çözüm Swift 2.2 ve Swift 3 için çalışıyor . Objective-C'den yalnızca sınıflar için uzantılara (yapılar veya numaralandırmalar için değil) erişilebileceğini unutmayın.
import UIKit
extension UIColor {
//Custom colours
class func otherEventColor() -> UIColor {
return UIColor(red:0.525, green:0.49, blue:0.929, alpha:1)
}
}
Sonra ObjC dosyanıza #import "ProductModuleName-Swift.h" yazın.
Swift 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
Gerekli olduğunu söylemenizin bir nedeni var mı ? public
Benim için değiştirici olmadan iyi çalışıyor . Uzantının aynı projede olmadığını, ancak başka bir projeden ithal edildiğini mi varsayıyoruz?
Diğer yanıtlarda ele alındığı gibi, oluşturulan Swift başlığını içe aktarmak çoğu durumda işe yarar .
Bunun bir istisnası, kategorinin köprülü bir tipte tanımlanmasıdır (yani uzantı üzerinde tanımlanır String
ve tanımlanmaz NSString
). Bu kategoriler otomatik olarak Objective-C meslektaşlarına köprülenmeyecek. Bunu aşmak için, ya Objective-C türünü kullanmanız (ve dönüş değerini Swift kodunuzda atmanız as String
) ya da hem Swift hem de Objective-C türleri için bir uzantı tanımlamanız gerekir.
public extension NSString
. Derleme zamanında çözülmemiş bir tanımlayıcı veya benzer bir hata alırsanız, örneğin let sVal = self as String
sVal
mclaughlinj
hem NSString sınıfı hem de String yapı için söylendiği gibi cast kullanabilir veya uzantılar yazabilirsiniz
Her şeyi doğru bir şekilde yapılandırdığınızı düşünüyorsanız (Swift varlıklarınızı @objcMembers veya @objc ile işaretleyin, köprüleme başlığını "ProductModuleName-Swift.h" vb. İçe aktarın) - ancak yine de No visible @interface for 'FooClass' declares the selector 'fooSelector'
hatayı alıyorsanız :
Eğer köprü başlığında arayüzleri görürseniz kontrol tarafından ctrl + cmd
üzerine tıklayarak. Eğer yoksa, bu soruya verdiğim cevaba bir göz atın : Swift to Objective-C başlığı Swift sınıfları içermiyor