- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
在我的 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
吗?
我考虑过像这样创建 public
和 private
变量以在两者之间进行转换。我不喜欢这个,但这是迄今为止我想出的最好的。
private var _options: FulfillmentOptions = []
private var options: UInt {
get {
// get raw value from _options
}
set {
// set raw value to _options
}
}
有没有更优雅的方法来完成这个?我想避免编写不必要的代码。
最佳答案
不是您问题的直接答案,但您可以作为替代方案反过来工作。定义
typedef NS_OPTIONS(NSInteger, FulfillmentOption) {
FulfillmentOptionPickup = 1 << 0,
FulfillmentOptionShipping = 1 << 1,
FulfillmentOptionUserShipping = 1 << 2,
};
在 Objective-C header 中,这将被导入到 Swift 中作为
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" 中找到引用:
Swift also imports C-style enumerations marked with the
NS_OPTIONS
macro as a Swift option set. Option sets behave similarly to imported enumerations by truncating their prefixes to option value names.
You’ll have access to anything within a class or protocol that’s marked with the
@objc
attribute as long as it’s compatible with Objective-C. This excludes Swift-only features such as those listed here:
- ...
- Structures defined in Swift
- ...
关于ios - 在 Objective-C 中访问 Swift OptionSetType,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32530018/
假设我有以下 OptionSetType struct Modifier : OptionSetType { typealias RawValue = Int var rawValue
我想创建一个带有自定义属性的 OptionSetType: struct Options: OptionSetType { let rawValue: Int init(rawValu
我有一个名为 ProgrammingLanguage 的枚举: enum ProgrammingLanguage { case Swift, Haskell, Scala } 现在我有一个名为 P
我试图弄清楚 OptionSetType 协议(protocol),但我有一些基本问题。 1)options是Array类型还是Set类型? 2) 我可以使用 for...in 循环或 for 循环访
我在自己的文件中定义了这个结构,想在其他地方和测试中使用它。 struct UserPermissions : OptionSetType { let rawValue: UInt s
鉴于以下情况: struct Weekdays: OptionSetType { let rawValue: Int init(rawValue: Int) { self.rawVal
我有一个 struct Person extends OptionSetType。在后面的代码中,如何使用 switch 语句来检查 Person 的实例是否有多个值? 谢谢 struct Perso
Swift 的 OptionSetType 协议(protocol)的目的是什么,它与仅仅利用 Set 来获取那些 SetAlgebraType 方法有何不同? 最佳答案 我将从使用OptionSet
在 Swift 1.2 之前,您可以在位掩码上执行 ~ (NOT): bitmask = ~otherBitmask 但是在 Swift 2.0 中,位掩码现在是 OptionSetType 并且您不
我在 Swift 中有一个自定义的 OptionSetType 结构。如何枚举实例的所有值? 这是我的 OptionSetType: struct WeekdaySet: OptionSetType
struct TimeMark: OptionSetType { private enum TimeMark : Int,CustomStringConvertible { case Head
在我的 Swift 类中,我为实现选项定义了一个 OptionSetType。 struct FulfillmentOption : OptionSetType { let rawValue:
我是一名优秀的程序员,十分优秀!