簡體   English   中英

Swift:訪問作為對象的 C 結構成員

[英]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 的導入版本。 我看過很多關於包含intfloat等的簡單結構的帖子。

如果我有這個結構體的全局實例(基本上是單例) 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM