Ошибка компилятора Swift struct при объявлении частного var

#swift #struct #xcode12

#swift #структура #xcode12

Вопрос:

У меня есть очень простой 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())
  

введите описание изображения здесь

Если я удалю private из новой blank переменной, она отлично компилируется.
Я упускаю из виду что-то простое здесь? Может ли struct не иметь частного var?

Ответ №1:

Как четко указано в документации по контролю доступа:

Инициализатор memberwise по умолчанию для типа структуры считается закрытым, если какое-либо из сохраненных свойств структуры является закрытым. Аналогично, если какое-либо из сохраненных свойств структуры является закрытым файлом, инициализатор является закрытым файлом. В противном случае инициализатор имеет уровень доступа internal.

Просто используйте пользовательский инициализатор.

Ответ №2:

Вы не можете использовать элемент по умолчанию initialiser для назначения struct's свойства с private модификатором уровня доступа.Если вам нужно назначить свое частное свойство с помощью initializer , вы должны написать свое собственное или дать значение инициализации частного члена, чтобы разрешить это

Комментарии:

1. Я не пытаюсь присвоить частной собственности. Или вы имеете в виду мое значение по умолчанию? Отменяет ли это инициализатор всего элемента?

2. в инициализаторе… присвоите ей значение по умолчанию

Ответ №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())