2015-01-27 12 views
13

Genel olmayan iOS işlevlerini nasıl arayabilirim? Özellikle, QuartzCore çerçevesinde herkese açık olmayan bir sınıf kullanmak istiyorum.Swift'de iOS özel API'lerine nasıl erişilir?

Aklıma gelen bir çözüm, bu genel-olmayan API'leri kamuya açık hale getirecek ve bu Objective-C işlevlerini Swift'den çağırmak yerine "köprüleme" Objective-C projesi oluşturmaktır. Ancak, çözümüm şimdi Swift Swift ve ben de bu şekilde kalmayı tercih ederim. Daha staitforward yolu var mı? (örneğin, bir şey eklemek Objective-C bridging header file)

Not: Ne düşündüğünüzü biliyorum, özel API'ler kullanılmaması gerektiğinden özeldir. Ben riskleri biliyorum, tüm donwsides, app mağaza kısıtlamaları vb. Farkındayım. Tüm dikkatle göz önüne alındıktan sonra ve çok araştırma yapıldıktan sonra, bu özel durumda hala gitmek için en iyi yol unfortunatelly görünüyor.

+0

bir köprü başlığına özel yöntemlerin düzgün beyanı eklerseniz dosya, sanki bir kategorideymiş gibi (adlandırılmış, 'PrivateButImmaUseTheseAnyway'), işe yarıyor mu? –

+0

@TheParamagneticCroissant Ne demek istediğimi anladığımdan emin değilim. Sadece başlık dosyasında köprüleme yöntemini bildirmenin mümkün olup olmadığını bilmiyordum. Tüm özel sınıfı ilan etmeye çalıştım - sınıfın var olmadığını söyleyen bir derleme hatası aldım ama belki doğru şekilde yapmadım. – drasto

+0

Yani, özel bir sınıfı şu şekilde bir kategori ile birlikte ilan edersiniz: @ @ viewview NSPrivateClass (PrivateStuff) ', ve özel yöntemlerin bildirimini oraya ekleyin. –

cevap

7

Sen NSClassFromString: kullanarak özel sınıflar olsun ve onları performSelector kullanarak etkileşim kurabilir.

15

Projeniz Objective-C içeriğinde olsaydınız yapacağınız aynı numarayı yapabilirsiniz.

Bir üstbilgi dosyası oluşturun ve ortaya çıkarmak istediğiniz özel yöntemlerin beyanı ile birlikte bir kategorinin beyanını sınıfa yerleştirin. Ardından, Swift derleyicisine bu köprüleme başlığını içe aktarmasını söyleyin.

Tanıtım amaçlı olarak, NSMutableString numaralı özel bir alt sınıf olan NSBigMutableString iç yapısında dolaşacağım ve onun _isMarkedAsImmutable yöntemini çağıracağım.

Burada, tüm sınıfın kendisi özel olduğundan, ilk gerçek sınıfının bir alt sınıfı olarak ilan etmem gerektiğini unutmayın. Bundan dolayı, sınıfın kendisinin beyanında doğru yöntemi açıklamış olabilirim; Ancak, bu, (Private) hile kategorisinin kullanımını gösteremezdi.

Sınıfınız halka açıksa, o zaman sadece kategoriye ihtiyacınız olacak ve sınıfın kendisini (yeniden) bildirmeniz gerekmeyecektir.

Bridge.h:

#import <Foundation/Foundation.h> 

@interface NSMutableString (Private) 
- (BOOL)_isMarkedAsImmutable; // this is a lie 
@end 

@interface NSBigMutableString : NSMutableString 
@end 

s.swift:

let s = NSBigMutableString() 
println(s._isMarkedAsImmutable()) 

Derleme ve çalıştırın:

$ xcrun -sdk macosx swiftc -o foo -import-objc-header Bridge.h s.swift 
$ ./foo 
false 
$ 
İlgili konular