【问题标题】:Swift - How to declare a private nested struct?Swift - 如何声明私有嵌套结构?
【发布时间】:2017-02-01 21:36:18
【问题描述】:

我想让我的代码更具可读性,所以我决定制作一些重复的字典键,软编码......所以我创建了一个新的 .swift 文件,其中包含 2 个结构:

struct DatabaseTableNames {
    let Photo = PhotoTable()
}

private struct PhotoTable {
    let lowQuality = "lowQuality"
    let highQuality = "highQuality"
    let numberOfLikes = "numberOfLikes"
}

所以我有我要使用的初始结构和第二个结构,我不希望它在文件范围之外可见...问题是,它表示 Photo 的属性DatabaseTableNames 结构体,需要声明为 fileprivate,因为 PhotoTableprivate...

我在这里做错了什么?

【问题讨论】:

  • 将 DatabaseTableNames.Photo 设为私有是否有效?
  • @MobileDan 然后它说“'Photo' 属性由于私有保护级别而无法访问”

标签: swift struct nested private


【解决方案1】:

关键是嵌套 PhotoTable 并使其属性静态化。

struct DatabaseTableNames {
    struct PhotoTable {
        static let lowQuality = "lowQuality"
        static let highQuality = "highQuality"
        static let numberOfLikes = "numberOfLikes"
    }
}

使用示例:

let test = DatabaseTableNames.PhotoTable.lowQuality
print(test)

【讨论】:

  • 然后它说“'Photo' 属性由于文件私有保护级别而无法访问”
  • static 表示它不是实例属性。如果您创建 PhotoTable 的实例,它将不包含对其静态属性的引用。您只能通过 DatabaseTableNames.PhotoTable.lowQuality 访问它。
  • 所以let dbTableNames = DatabaseTableNames; print(dbTableNames.lowQuality) 是不可能的?
  • 我想你的意思是:let photoTable = DatabaseTableNames.PhotoTable(); print(photoTable.lowQuality),它不会编译。
  • "静态成员 'lowQuality' 不能用于类型为 'DatabaseTableNames.PhotoTable' 的实例"
【解决方案2】:

更换您的 private 设置 - 并确保它与您要使用的 UIViewController 在同一个文件中定义

private struct DatabaseTableNames {
    let Photo = PhotoTable()
}

struct PhotoTable {
    let lowQuality = "lowQuality"
    let highQuality = "highQuality"
    let numberOfLikes = "numberOfLikes"
}

然后,访问结构体

private var photo : DatabaseTableNames?

【讨论】:

  • 但我想让我的所有其他类访问“DatabaseTableNames”,而不仅仅是一个......
  • 如果结构中唯一的变量是隐藏的,那么你与其他文件共享什么?
  • 就是这样!我希望能够使用例如:来自其他所有文件的“DatabaseTableNames.Photo.lowQuality”,但我不想能够直接访问“PhotoTable”结构......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-16
  • 2015-12-29
  • 1970-01-01
  • 2019-12-14
相关资源
最近更新 更多