How can I make this OptionSetType struct public?

296 views Asked by At

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?

1

There are 1 answers

0
Code Different On BEST ANSWER

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]