2015-09-11 46 views
3

在我的Swift類中,我有一個爲履行選項定義的OptionSetType。訪問Objective-C中的Swift OptionSetType

struct FulfillmentOption : OptionSetType { 
    let rawValue: Int 

    static let Pickup = FulfillmentOption(rawValue: 1 << 0) 
    static let Shipping = FulfillmentOption(rawValue: 1 << 1) 
    static let UserShipping = FulfillmentOption(rawValue: 1 << 2) 
} 

然後,我創建一個變量來添加/刪除和讀取選項。這按預期工作。

var options: FulfillmentOption = [] 
options.insert(FulfillmentOption.Pickup) 
options.contains(FulfillmentOption.Pickup) 

但是我需要從我的一個Objective-C類訪問options變量。由於OptionSetType沒有在Objective-C中定義,因此該變量對於我的任何Objective-C類都是不可見的。

什麼是我最好的方式公開這個Objective-C?我應該停止使用OptionSetType嗎?

我已經考慮過創建像這樣的公共和私有變量來在兩者之間進行轉換。我不喜歡這個,但這是迄今爲止我所提出的最好的。

private var _options: FulfillmentOptions = [] 
private var options: UInt { 
    get { 
    // get raw value from _options 
    } 
    set { 
    // set raw value to _options 
    } 
} 

有沒有更好的方法來實現這個目標?我想避免編寫不必要的代碼。

+2

你可以解決的其他方式:在Objective-C中定義'typedef NS_OPTIONS(NSInteger,FulfillmentOption){...}',這會作爲OptionSetType導入到Swift中。 (只是一個想法。) –

+0

有趣!我沒有意識到這一點。我會試試這個,謝謝! –

回答

7

不是您的問題的直接答案,但作爲一種替代方法,您可以使用其他方式工作 。在一個Objective-C標題定義

typedef NS_OPTIONS(NSInteger, FulfillmentOption) { 
    FulfillmentOptionPickup = 1 << 0, 
    FulfillmentOptionShipping = 1 << 1, 
    FulfillmentOptionUserShipping = 1 << 2, 
}; 

,這將被導入到快速作爲

public struct FulfillmentOption : OptionSetType { 
    public init(rawValue: Int) 

    public static var Pickup: FulfillmentOption { get } 
    public static var Shipping: FulfillmentOption { get } 
    public static var UserShipping: FulfillmentOption { get } 
} 

更多的信息可以在"Using Swift with Cocoa and Objective-C"參考文獻中找到:

  • 「的相互作用以C的API 「:

Swift還將C型枚舉標記爲 NS_OPTIONS 宏作爲Swift選項集。選項集的行爲與導入的 枚舉類似,方法是將其前綴截斷爲選項值名稱。

  • 「斯威夫特和在同一項目中的Objective-C」:

你有一個類或協議,這是 標有@objc屬性中獲得什麼,只要它與 Objective-C兼容。這不包括斯威夫特獨有特性,如這裏列出 :斯威夫特

  • 定義

    • ...
    • 結構...
  • +1

    耶,它的工作原理!你知道這是否記錄在任何地方?我非常奇怪蘋果公司實施了ObjC - > Swift,但並沒有讓它變得可逆。 –

    +2

    @Brandon:我添加了一些參考。 –