簡體   English   中英

在Swift中使用Objective C枚舉返回Objective C

[英]Using an Objective C enum in Swift back in Objective C

我有一個在目標C中定義的枚舉,並用作Swift對象中的數據類型。

現在,我在Objective C中使用該swift對象,並且想訪問該屬性。

但是,該屬性不會添加到類中的“ xxxx-Swift.h”文件中。 我知道可以在Obj C中以@objc開頭使用Swift枚舉,但是我對這個枚舉沒有太多控制權,因為它是從現有的Objective C代碼自動生成的。

我不確定您的用例是什么,但這是一個簡單的示例,說明如何在Swift類中使用Objective-C中定義的枚舉,而該類又可以在Objective-C中使用。

這是Objective-C標頭( oclib.h ):

#ifndef oclib_h
#define oclib_h

#import <Foundation/Foundation.h>

typedef enum {A, B, C} oc_enum_t;

void useSwiftClassInC();

#endif /* oclib_h */

這是相應的Objective-C .m文件( oclib.m ):

#import "oclib.h"
#import "swift_c_1-Swift.h" // Need this to have access to Swift types; the swift_c_1 part will be your product module name.

void useSwiftClassInC() {
    UseEnum *ue = [[UseEnum alloc] initWithE:B i:444];
    printf("In Objective-C useSwiftClassInC(): m_Enum = %d, m_Int = %d\n", ue.m_Enum, ue.m_Int);
    ue.m_Enum = A;
    ue.m_Int = 10;
    [UseEnum printUseEnum: ue];
}

這是Swift文件:

// Swift class that uses an enum from Objective-C    
class UseEnum : NSObject // NSObject inheritance is important!
    {
        var m_Enum : oc_enum_t
        var m_Int : Int32

        init(e : oc_enum_t, i : Int32)
        {
            m_Enum = e
            m_Int = i
        }

        static func printUseEnum( x : UseEnum )
        {
            print("In Swift UseEnum::printUserEnum: m_Enum = \(x.m_Enum), m_Int = \(x.m_Int)")
        }
    }

    // This calls an Objective-C function that does the following:
    // - creates a UseEnum object
    // - prints it out from Objective-C
    // - modifies it
    // - calls printUseEnum(), implemented in Swift, to print the object
    useSwiftClassInC()

橋接頭只有

#import "oclib.h"

您可能已經看過此文檔,但如果沒有,則為: https : //developer.apple.com/library/ios/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html

如果無法回答您的問題,請提供有關您具體情況的更多詳細信息。 這是我從示例中獲得的輸出:

In Objective-C useSwiftClassInC(): m_Enum = 1, m_Int = 444
In Swift UseEnum::printUserEnum: m_Enum = oc_enum_t(rawValue: 0), m_Int = 10

如果在Swift中定義的數據類型用於需要從Swift調用的Objective-C函數的簽名中,則會出現一種有趣的情況。 Xcode不允許我們將*-Swift.h導入到Objective-C標頭或橋接標頭中。 一種解決方法是使用Swift類型的@class前向聲明。 因此,如果在上面的示例中我們需要一個以UseEnum作為參數的Objective-C函數,則在UseEnum中可能會有類似的oclib.h

...
@class UseEnum; // Forward declaration must come before UseEnum is used!
...
void useSwiftClassInC_1(UseEnum * useEnum);
...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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