【问题标题】:Swift struct compiler error when declaring a private var声明私有 var 时出现 Swift 结构编译器错误
【发布时间】:2020-08-29 10:22:33
【问题描述】:

我有一个非常简单的struct,它可以按预期工作:

struct Obligation {
    
    var date = Date()
}

let snapshotEntry = Obligation(date: Date())

但是,如果我向这个结构添加一个私有 var,我会在我创建我的结构的一个实例的行上得到一个编译错误,上面写着 Argument passed to call that takes no arguments:

struct Obligation {
    
    var date = Date()
    
    private var blank:Bool = false
}

let snapshotEntry = Obligation(date: Date())

如果我从新的 blank var 中删除 private,它编译得很好。 我在这里忽略了一些简单的事情吗? struct 可以没有私有变量吗?

【问题讨论】:

    标签: swift struct xcode12


    【解决方案1】:

    正如Access Control 文档明确指出的那样:

    考虑结构类型的默认成员初始化器 如果结构的任何存储属性是私有的,则为私有。 同样,如果结构的任何存储属性是文件 私有的,初始化器是文件私有的。否则,初始化器 具有内部访问级别。

    只需使用自定义初始化程序。

    【讨论】:

      【解决方案2】:

      您不能使用默认成员明智的initialiser 来分配具有private 访问级别修饰符的struct's 属性。如果您需要使用initializer 分配您的私有属性,您必须编写自己的或给予私有成员发起值解决它

      【讨论】:

      • 我不想分配给私有财产。或者你的意思是我的默认值?这是否否定了整个成员明智的初始化程序?
      • 在初始化程序中...给它默认值
      【解决方案3】:

      这应该可行:

      struct Obligation {
          var date: Date
          private var blank: Bool
          
          init(date: Date = Date(), blank: Bool = false) {
             self.date = date
             self.blank = black
          }
      }
          
      let snapshotEntry = Obligation(date: Date())
      

      【讨论】:

        猜你喜欢
        • 2014-08-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-09
        • 1970-01-01
        • 1970-01-01
        • 2023-01-08
        相关资源
        最近更新 更多