Сцепление методов достаточно простое и позволяет нам писать что то похожее на DSL-синтаксис.
Создадим новую функцию, которая делает что то и затем возвращает self. Это просто:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | enum ColorScheme: Int { case Light, Dark, Black } class CustomSomething { var title: String = "" func title(aTitle: String?) -> CustomSomething { title = aTitle ?? ""; return self } var subtitle = "" func subtitle(aSubtitle: String?) -> CustomSomething { subtitle = aSubtitle ?? ""; return self } var colorScheme: ColorScheme = .Black func colorScheme(scheme: ColorScheme) -> CustomSomething { colorScheme = scheme; return self } } |
Это позволяет создавать сверхчитаемые и последовательный набор кода:
1 2 3 4 | CustomSomething() .title(aTitle: "New Custom Something") .subtitle(aSubtitle: "Enjoy") .colorScheme(scheme: .Light) |
1 | let someObj = CustomSomething() .title(aTitle: "New Custom Something") .subtitle(aSubtitle: "Enjoy") |
Настройка свойств — только вершина айсберга. Представьте себе эту технику для создания сцепления запросов:
1 2 3 4 | Event .withCategory(.Meeting) .withAttendees([User.me]) .sort { $0.startDate < $1.startDate } |
Итог:
- ?Пишем сеттеры
- ?Возвращаем self
- ?Profit
Все бы хорошо, но писать в одну строчку присваивание и return это сверхНЕчитаемо:
title = aTitle ?? «»; return self
не читаемо писать по 50 строк так. А тут их всего 2. Вообще без разницы
Отличная идея, спасибо!