Swift3 присваивает значения обнуляемому объекту - PullRequest
0 голосов
/ 22 октября 2018
if project == nil {
    project = Project()
}

project!.title = titleInput.text
project!.description = descInput.text
project!.field1 = field1.text
project!.field2 = field2.text
project!.field3 = field3.text
project!.field4 = field4.text
project!.field5 = field5.text

В приведенном выше коде перед присвоением значений объекту он генерирует экземпляр проекта, если проект равен нулю.Таким образом, мы можем быть уверены, что проект никогда не будет нулевым, но ниже он все еще использует ! (проект! .Xx), поэтому он выглядит уродливо.

Как мне сделать его чище?

[Edit] Проект является переменной класса, и проект может быть нулевым или нет.Итак, мне нужно проверить перед созданием экземпляра.

Ответы [ 2 ]

0 голосов
/ 22 октября 2018

Чтобы создать экземпляр, если он nil выглядит как ленивое свойство экземпляра.

if project == nil {
    project = Project()
}

довольно target-c-ish , в Swift есть более изощренный способключевое слово lazy не требуется, поскольку по умолчанию свойства класса создаются лениво.

static var project : Project = {
    let proj = Project()
    proj.title = titleInput.text
    proj.description = descInput.text
    proj.field1 = field1.text
    proj.field2 = field2.text
    proj.field3 = field3.text
    proj.field4 = field4.text
    proj.field5 = field5.text
    return proj
}()

Вы также можете использовать

static var project = Project()

или, если Project имеет семантику ссылок даже

static let project = Project()

на верхнем уровне класса - это свойство также лениво создается - и присваивать значения свойств где-то еще.

Во всех случаях экземпляр не создается до тех пор, пока к нему не получен доступ.в первый раз, и он создается один раз .

0 голосов
/ 22 октября 2018
let project = project ?? Project()

project.title = titleInput.text

Оператор объединения nil ?? оценивает значение выражения, отличное от nil, или последующее значение, которое может быть или не быть необязательным.

Обновление для редактирования: самый чистыйподход немного зависит от контекста этого кода, но я все еще мог бы использовать подобную конструкцию:

let project = self.project ?? Project()

project.title = titleInput.text
...

self.project = project

Я начинаю задумываться, должно ли это свойство класса действительно быть Optional?В таком случае, должно ли это быть собственностью?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...