2017-05-25 51 views
1

在框架中,我們使用Swift和ObjC,以便Swift實例在ObjC方法中實例化。爲了做到這一點,我們必須將這些swift文件公開/公開,以便它們出現在SWIFT_INSTALL_OBJC_HEADER(OurModule-Swift.h)中,然後由ObjC導入。 問題是,我們想從框架的公共接口隱藏這些Swift類。蘋果說:framwork中的私有Swift和ObjC依賴

對於框架的目標,只能用publicopen修改聲明出現在生成的頭。只要它們在繼承自Objective-C類的類中聲明,仍然可以在框架的Objective-C部分中使用標有internal修飾符的Swift方法和屬性。有關訪問級別修飾符的更多信息,請參閱Swift編程語言(Swift 3.1)中的訪問控制。

所以理論上應該可以從ObjC創建內部的swift類,但它似乎不起作用。有任何想法嗎?

回答

1

您引用的文檔僅提及內部方法和屬性,而不是類。同一文檔還表示,在不同的部分:

標有內部 改性劑和從一個Objective-C 類繼承的類內聲明夫特方法和屬性的目標C訪問運行。但是,它們不是在編譯時可訪問的 ,並且不會出現在爲框架目標生成的標頭 中。

請參閱導入斯威夫特成的Objective-C在https://developer.apple.com/library/content/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html#//apple_ref/doc/uid/TP40014216-CH10-ID122

因此,你可以讓雨燕類public,讓他們在你的框架的Objective-C的部分可用,但要保持這些類internal的方法和屬性。由於它們在編譯時不可用,因此可以通過使用類擴展a.k.a匿名類別讓Objective-C代碼瞭解它們。

假設你有以下雨燕類,你要隱藏其實現:

public class SecretSwiftClass : NSObject {  
    func swiftFun(arg1 a : Int32, arg2 b : Int32) -> Int32 { 
     return a + b 
    } 
} 

在你的框架的Objective-C代碼,你可以按如下方式使用內部swiftFun()方法:

#import "YourProduct-Swift.h" 

// Use an extension to let the compiler know about the hidden method 
@interface SecretSwiftClass() 
-(int32_t)swiftFunWithArg1:(int32_t)l arg2:(int32_t)m; 
@end 

// You will make this one visible to client code via the 
// framework's umbrella header 
@implementation PublicOCClass : NSObject 

-(int32_t) ocFun:(int32_t)int1 :(int32_t)int2 { 
    SecretSwiftClass * sc = [[SecretSwiftClass alloc] init]; 
    return [sc swiftFunWithArg1:int1 arg2: int2]; 
} 

@end 
+0

我猜它的作品,但它似乎很難保持和大量的手動工作。與https://developer.apple.com/library/content/documentation/MacOSX/Conceptual/BPFrameworks/Tasks/ExportingInterfaces.html#//apple_ref/doc/uid/20002260-97049完全相同,您可以限制API但仍然從手生成/寫入導出文件似乎不是最好的事情。 – Fishman