I have this struct defined in its own file and want to use it elsewhere and in testing.
struct UserPermissions : OptionSetType {
let rawValue: UInt
static let CreateFullAccount = UserPermissions(rawValue: 1 << 1)
static let CreateCustomAccount = UserPermissions(rawValue: 1 << 2)
}
When I try to use it I get an error about how the property cannot be declared public because the type uses an internal type.
public var userPermissions = UserPermissions()
So I thought I could make it public, but that gives me an error about needing a public init function.
public struct UserPermissions : OptionSetType {
public let rawValue: UInt
static let CreateFullAccount = UserPermissions(rawValue: 1 << 1)
static let CreateCustomAccount = UserPermissions(rawValue: 1 << 2)
}
So I add this to the definition of the struct, which causes the compiler to crash:
public init(rawValue: Self.RawValue) {
super.init(rawValue)
}
Some of the access control stuff I'm still wrapping my head around in Swift. What am I doing wrong? How can I use this OptionSetType?
Had you visited the OptionSetType
protocol reference page, you would have found an example of what you need. Your UserPermissions
is a struct, there's no super
to be called.
Now to answer your question:
public struct UserPermissions : OptionSetType {
public let rawValue: UInt
public init(rawValue: UInt) { self.rawValue = rawValue }
static let CreateFullAccount = UserPermissions(rawValue: 1 << 1)
static let CreateCustomAccount = UserPermissions(rawValue: 1 << 2)
}
// Usage:
let permissions: UserPermissions = [.CreateFullAccount, .CreateCustomAccount]