如何将此OptionSetType结构公开?

时间:2015-12-08 15:22:53

标签: swift struct access-control optionsettype

我在自己的文件中定义了这个结构,并希望在别处和测试中使用它。

struct UserPermissions : OptionSetType {
    let rawValue: UInt
    static let CreateFullAccount = UserPermissions(rawValue: 1 << 1)
    static let CreateCustomAccount = UserPermissions(rawValue: 1 << 2)
}

当我尝试使用它时,我收到有关如何无法将属性声明为public的错误,因为该类型使用内部类型。

public var userPermissions = UserPermissions()

所以我认为我可以公开它,但这给了我一个关于需要公共init函数的错误。

public struct UserPermissions : OptionSetType {
    public let rawValue: UInt
    static let CreateFullAccount = UserPermissions(rawValue: 1 << 1)
    static let CreateCustomAccount = UserPermissions(rawValue: 1 << 2)
}

所以我将它添加到struct的定义中,这会导致编译器崩溃:

public init(rawValue: Self.RawValue) {
    super.init(rawValue)
}

一些访问控制的东西我仍然在Swift中缠头。我究竟做错了什么?我该如何使用这个OptionSetType?

1 个答案:

答案 0 :(得分:2)

如果你访问了OptionSetType protocol reference页面,你会找到一个你需要的例子。你的UserPermissions是一个结构,没有super被调用。

现在回答你的问题:

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]