Понимание использования расширения Swift в дизайне вашего API

API Alamofire имеет такие расширения, как extension Request в ResponseSerialization.swift. Почему при разработке Swift API вы должны использовать этот подход, а не просто добавлять эти методы в класс Request (Request.swift)?

Я понимаю использование расширений для расширения API, когда вы не контролируете источник. Этот вопрос касается их использования для расширения вашего собственного API.


person Marcus Leon    schedule 02.04.2016    source источник
comment
Все расширения в этом файле необходимы в контексте ResponseSerializer, поэтому их естественное место лучше подходит для ResponseSerializer.swift, чем для Request.swift.   -  person Darko    schedule 03.04.2016


Ответы (2)


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

Например, если у вас есть UIViewController и вы добавляете к нему табличное представление, вместо того, чтобы объявление ViewController выглядело так:

class ViewController : UIViewController, UITableViewDataSource, UITableViewDelegate

вы можете разделить все это с помощью расширений, чтобы не загромождать файл ViewController.

Вот так:

extension ViewController : UITableViewDataSource, UITableViewDelegate

который вы можете отделить от основного тела класса ViewController или извлечь в новый файл.

person Wes    schedule 02.04.2016
comment
Боюсь, вы упустили суть, поскольку ОП, вероятно, спрашивает, почему кто-то расширяет свои собственные классы, а не чьи-то еще классы. - person Earl Grey; 03.04.2016
comment
@EarlGrey да, я упомянул о расширении вашего собственного класса в моем примере View Controller, причина, по которой кто-то может захотеть расширить свои собственные классы, заключается в чистоте и организации их кода. - person Wes; 03.04.2016

Расширения — одна из лучших функций языка программирования Swift, и для них есть несколько вариантов использования. Как только вы овладеете ими, вы сможете придумать действительно хороший и понятный код. Некоторые из вариантов использования:

<сильный>1. Расширение типов систем

С помощью Swift вы можете использовать любой системный тип, например Int или String, чтобы сделать код более читабельным и получить дополнительные функциональные возможности, которые в противном случае вам пришлось бы писать самостоятельно. Например, обратите внимание на следующий код, который повторяет некоторую задачу несколько раз:

extension Int {
    func repetitions(task: () -> Void) {
        for _ in 0..<self {
            task()
        }
    }
}

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

3.repetitions({
    print("Hello!")
})

// Hello!
// Hello!
// Hello!

Все могут согласиться с тем, что это самый простой и чистый код, который вы когда-либо могли создать.

2. Сделайте беспорядочный код читаемым

Проверьте следующее определение:

class MyTableViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, CLLocationManagerDelegate {
   // a lot of functions 
}

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

class MyTableViewController: UIViewController {
}

extension MyTableViewController: UITableViewDelegate {
}

extension MyTableViewController: UITableViewDataSource {
}

// etc...

<сильный>3. Расширения протокола

Расширение протокола — одна из самых крутых функций Swift. Они позволяют добавлять методы в любой класс, использующий протокол, который вы расширяете. Например, давайте расширим протокол CollectionType.

extension CollectionType {
   func printAll() {
      print(self)
   }
}

Теперь вы можете использовать метод printAll() на любой структуре, использующей этот протокол! Некоторые из них являются родными типами Swift, такими как Array, Dictionary или Set.

Это лишь некоторые из основных применений расширений, и они могут делать гораздо больше:

  • Добавьте свойства вычисляемого экземпляра и свойства вычисляемого типа
  • Определение методов экземпляра и методов типов
  • Предоставить новые инициализаторы
  • Определить индексы
  • Определение и использование новых вложенных типов
  • Сделать существующий тип соответствующим протоколу
person Said Sikira    schedule 02.04.2016