2016-06-17 2 views
2

Я новичок в swift и пытаюсь найти определение для этого типа экземпляра, но не повезло. Я видел что-то подобное в примере проекта. Как это называется?Какая переменная Декларация такова в Swift

Пример:

var str = "Hello World" 

var test: Int { 
    var testVal = 5 

    if !str.isEmpty { 
     testVal = 10 
    } 
    return testVal 
} 

В XCode игровой площадке, это покажет значение для str, но не для test. Пока вы не наберете test на новой строке или не используйте ее в другом месте. Я думал, что это пример autoclosure, но он имеет более преднамеренный синтаксис и сразу же запускается.

Пример autoclosure с ярлыком синтаксисом:

var str = "Hello World" 

var test: Int = { 
    var testVal = 5 

    if !str.isEmpty { 
     testVal = 10 
    } 
    return testVal 
}() 

Этот последний пример будет определять test сразу же, и вы увидите выход на детской площадке, например. Преимущество первого заключается в том, что для более сложных ситуаций оно будет задерживаться, определяя значение

+1

Существует еще третья форма, которая добавляет 'lazy' перед« var test »во втором примере. Разница в том, что инициализация не будет сформирована до тех пор, пока переменная не будет доступна в первый раз - как вычисленное свойство, а код запускается один раз. – vadian

+0

Да, есть некоторые тонкие нюансы в этих типах, которые не имеют эквивалентов на моих других языках (как минимум, на уровне языка). Как упоминалось в @atreat, вы можете добавить «ленивый» к последнему, а не к первому. – drewpotential

ответ

4

Ваш первый пример - 'Computed Property', каждый раз, когда к этой переменной обращаются, выполняется закрытие. Вот как вы можете переопределить получателя и настройки свойства. В вашем коде выше, наличие единственного замыкания неявно определяет это как геттер. Вы также можете сделать:

var test: Int { 
    get { 
    var testVal = 5 

    if !str.isEmpty { 
     testVal = 10 
    } 
    return testVal 
    } 
    set(value) { 
    test = value 
    } 
} 

Ваш второй пример - это просто определение замыкания, которое выполняется немедленно. Это закрытие запускается только один раз, когда объект инициализируется. Полезно следовать этому шаблону, если вы хотите, чтобы вычислительные свойства были «ленивыми». Когда ленив, закрытие будет запускаться один раз, когда свойство будет сначала доступно, а не при инициализации объекта.

Синтаксис выглядит очень похожим, но идеи свойств компьютера и ленивых свойств имеют тонкие отличия. Важно отметить, что свойства компьютера не могут быть помечены как lazy.

+0

Только то, что я искал, так спасибо! Я наткнулся на другие части вычисляемых свойств, но не видел этого ярлыка, чтобы получить синтаксис объявления {}. – drewpotential

+0

Существует также сокращение для 'set' to.Полное объявление будет 'set (value: Int)', но вы можете сократить его до 'set (value)' (чтобы использовать вывод типа, это то, что @atreat опубликовано), а затем еще больше просто 'set' (в этом случае подразумевается имя по умолчанию 'newValue') – Alexander

+0

Для новичков было бы неплохо увидеть разбивку различных ярлыков по сравнению с полным примером в его наиболее подробной форме. Не уверен, что это существует в любом учебном пособии ... – drewpotential

1

Это Расчетное имущество.

Вычислимые свойства Отложить до сохраненные свойства в том, как вы назначаете значение самому свойству (или переменной). В вашем случае переменная str является сохраненным свойством, так как вы назначаете значение без дальнейших операций над самим значением.

Если вы изучите переменную test, вы заметите, что для присвоения значения вам необходимо выполнить дальнейшие операции, а затем вернуть фактическую информацию, которую вы хотите сохранить. Вычислимые свойства также могут возвращать значение хранимого свойства, а также предоставляют геттер и необязательный набор для себя.

Смежные вопросы