2016-02-23 6 views
6

Ağırlıklı olarak Objective-C olan ancak Swift'e dönüştürme işleminde olan mevcut büyük bir kod tabanı üzerinde çalışıyorum.Swift/ObjC dairesel ithalat

Swift'de yeni sınıflar uygulanıyor, ancak bu sınıfların bir kısmının mevcut ObjC kodundan erişilmesi gerekiyor. Hem ObjC hem de Swift en iyi uygulamalarını takip etme girişiminde, yeni sınıfların bir öneki yoktur, ancak ObjC için bir önek ile tanımlanmıştır.

/** 
Create contrived class that is named XXClassA in ObjC and ClassA in Swift. 
*/ 
@objc(XXClassA) class ClassA: NSObject { 
    let foo = "bar" 
} 

Şimdiye kadar bu harika çalışıyor; Hızlı kod, ClassA() kullanır ve ObjC, [[XXClassA alloc] init] kullanır. XXClassA'ya başvuran tüm ObjC kodları kaldırıldıktan sonra, Swift sınıfından @objc(XXClassA) da kaldırılabilir.

Bir ObjC sınıf başvurusu XXClassA'nız varsa ve daha sonra Swift kodu ClassA'nın içinde bu yeni sınıfı kullanmaya çalışırsa, bu durum bozulur.

Ben XXClassC adında bir objc sınıfını oluşturmak Say ve kullanarak kendisini başlatır

// 
// XXClassC.h 
// 

#import <Foundation/Foundation.h> 

NS_ASSUME_NONNULL_BEGIN 

@class XXClassA; 

@interface XXClassC : NSObject 

-(instancetype)initWithA:(XXClassA *)classA; 

@end 

NS_ASSUME_NONNULL_END 

dairesel referans yerinde artık (gerçekten Swift sınıf ClassA olan) bir XXClassA. XXClassC'yi ClassA'nın içinden kullanmaya çalışırsam, başlatıcı kullanılamaz. Bunun yerine bu şekilde Classa yeniden tanımlamak durumunda

enter image description here

, bütün tekrar iyi olduğunu. Bu neden oluyor

class XXClassA: NSObject { 
    let foo = "bar" 
} 

anlıyorum ve ben yerde var düzeltme, ancak önceden sabitlenmiş objc sınıfların bu kalıbı kullanmaya devam etmek istiyorum. Dairesel ithalatı nasıl önleyeceğimize dair herhangi bir fikir, ancak adlandırma kuralı da devam ediyor mu? Burada

Tam kod örneği: https://gist.github.com/justAnotherDev/78483f9d94e40fd90c38

cevap

0

Ben aynı sorunu yaşıyorum. Benim geçici çözümüm:

  • Swift sınıfı için bir objc stili öneki adı kullanın.
  • Bir yazım hatası ekleyin: typealias ClassA = XXClassA.
  • Her zaman düzeltilmemiş adı Swift kodundan kullanın.

Bu kalıpta, son nesne bağımlılığı giderildiğinde öneki kaldırmak en az kolaydır.