Видеокурсы по изучению языка программирования Swift. Подробнее

Начальное значение свойства в виде функции или замыкания

Если вы нашли опечатку в тексте, выделите ее и нажмите CTRL + ENTER.

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

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

Ниже приведена схема того, как замыкание может предоставлять начальное значение свойству:

class SomeClass {
  let someProperty: SomeType = {
    // создаем начальное значения для SomeProperty внутри этого замыкания
    // someValue должен быть того же типа, что и SomeType
    return someValue
  }()
}

Обратите внимание, что после закрывающей фигурной скобки замыкания идут пустая пара круглых скобок. Это говорит Swift, что нужно исполнить это замыкание немедленно. Если вы пропустите эти скобки, то вы присваиваете само значение замыкания свойству, а не возвращаете значения замыкания.

Заметка

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

Пример ниже определяет структуру Checkerboard, которая моделирует доску для игры “Шашки”:

В игру шашки играют на доске 10х10, с чередующимися черными и белыми клетками. Для отображения игральной доски для этой игры, структура Checkerboard имеет единственное свойство boardColors, которое является массивом из 100 значений типа Bool. Значение true отображает черные клетки, false - белые. Первое значение массива отображает левый верхний угол доски, значение последнего элемента отображает правый нижний угол доски.

Массив boardColors инициализирован с помощью замыкания для установки значений цветов:

struct Checkerboard {
  let boardColors: [Bool] = {
    var temporaryBoard = [Bool]()
    var isBlack = false
    for i in 1...10 {
      for j in 1...10 {
        temporaryBoard.append(isBlack)
        isBlack = !isBlack
      }
      isBlack = !isBlack
    }
    return temporaryBoard
  }()
  func squareIsBlackAt(row: Int, column: Int) -> Bool {
    return boardColors[(row * 10) + column]
  }
}

Когда бы вы не создали новый экземпляр Checkerboard, замыкание исполняется, и начальное значение boardColors высчитывается и возвращается. Замыкание в примере выше высчитывает временный массив temporaryBoard и возвращает его в качестве возвращаемого значения замыканием, как только он весь заполняется. Возвращенный массив сохраняется в boardColors и может быть запрошен через метод squareIsBlackAt:

let board = Checkerboard()
print(board.squareIsBlackAt(row: 0, column: 1))
// выведет "true"
print(board.squareIsBlackAt(row: 9, column: 9))
// выведет "false
Swift: 
3.0