2014-06-07 47 views
6

我有一個子類TyphoonAssembly的,其中包含此工廠方法:創建從Objective-C的工廠方法斯威夫特例如

+ (instancetype)assembly; 

我嘗試如下的測試中使用它:

var assembly : ApplicationAssembly! = ApplicationAssembly.assembly() 

但是得到錯誤'assembly()is unavailable'(見圖)。

什麼是從Objective-C類方法創建Swift實例的正確方法。

enter image description here

+0

我經歷了同樣的問題。您可以改變您的靜態方法名稱,而不是使用虛擬參數。例如:+(instancetype)sharedInstance;穿過橋。 – kokluch

回答

4

當橋接從客觀-C代碼來迅速編譯器試圖類方法構造轉換爲正常的初始化。嘗試調用ApplicationAssembly()並查看它是否調用了你的類方法。您還可以更改類方法的名稱,以便編譯器不會將其識別爲常見的構造函數命名。

這裏是一個有效的橋樑的例子:

// Objective-C 
@implementation ApplicationAssembly 

+ (instancetype)assemblyWithValue:(NSString *)value 
{ 
    ApplicationAssembly *new = [[self alloc] init]; 
    new.value = @"Some_Value_To_Make_Sure_That_This_Code_Is_Running"; 
    return new; 
} 

@end 

// Swift 
var assembly = ApplicationAssembly(value: "") 
println(assembly.value) // outputs "Some_Value_To_Make_Sure_That_This_Code_Is_Running" 

像你試圖訪問它不具有空類的方法構造工作。

+0

調用ApplicationAssembly()直接進入init,它實際上是私有的,因爲類方法在返回之前做了一些進一步的配置。 。 。幸運的是,額外的配置可以安全地移動到init。 。 。不確定如果a)不是我控制的ObjC類或b)它不能被移動。 –

+0

@JasperBlues雅我不確定。我做了一些實驗,找不到可以調用類方法的初始化程序 – drewag

+0

注意:'new'可能最好留給'[MyClass new]',它可以簡寫爲[[MyClass alloc] init]'。 –