[英]Swift: Accessing C Struct Members That Are Objects
在我的應用程序中,我有一個保存顏色的全局 C 結構:
//Colors.h
extern struct MYColors *appColors;
struct MYColors
{
CGColorRef appBackgroundColor;
// ...Lots more colors follow
};
以及匹配的實現文件:
//Colors.m
struct MYColors *appColors = calloc(1, sizeof(struct MYColors));
appColors->appBackgroundColor = CGColorCreateGenericRGB(23.0f/255.0f, 24.0f/255.0f, 26.0f/255.0f, 1.0f);
這使我可以集中所有應用程序的顏色。 在各種自定義視圖中,我在 Objective-C 中編寫了這樣的代碼:
- (void) updateLayer {
someCGLayer.backgroundColor = appColors->appBackgroundColor;
}
我開始將此應用程序遷移到 Swift,但我無法弄清楚如何訪問此 C Struct 的導入版本。 我看過很多關於包含int
、 float
等的簡單結構的帖子。
如果我有這個結構體的全局實例(基本上是單例) appColors
,我如何從 Swift 訪問該結構體的成員?
這不起作用。 Swift 聲稱MYColors
沒有appBackgroundColor
:
let color: CGColor = UnsafePointer<MYColors>(appColors).appBackgroundColor
我還想也許我只需要像這樣訪問單身人士:
let color: CGColor = UnsafePointer<MYColors>(MyModuleName.appColors!).appBackgroundColor
但這也行不通。
C 聲明
extern struct MYColors * appColors;
導入到 Swift 中
public var appColors: UnsafeMutablePointer<MYColors>!
在 Swift 中通過pointee
屬性取消引用指針,因此 Swift 等效於 (Objective-)C 代碼
appColors->appBackgroundColor
是
appColors.pointee.appBackgroundColor
該值的類型是Unmanaged<CGColor>!
因為 Swift 編譯器不知道應該如何管理對象的內存。 在您的情況下,調用者不負責釋放對象,因此最終代碼是:
let bgColor = appColors.pointee.appBackgroundColor.takeUnretainedValue()
有關非托管引用的更多信息,請參閱Unmanaged
。
備注:如果appColors
和所有 struct 成員在訪問時保證為非 NULL,那么您可以在接口中使用_Nonnull
注釋它們:
struct MYColors {
CGColorRef _Nonnull appBackgroundColor;
// ...
};
extern struct MYColors * _Nonnull appColors;
Swift 編譯器然后將變量作為非可選變量而不是(隱式解包的)可選變量導入。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.