2016-12-20 2 views
1

Если у меня есть класс Christmas и протокол Merry, чтобы сделать Christmas соответствовать Merry, многие люди будут делать это таким образом:Почему мы добавляем соответствие протокола с расширениями?

class Christmas { 
    ... 
} 

extension Christmas: Merry { 
    ... 
} 

Он также воодушевлены Apple.

Однако не удобнее ли просто соответствовать классу протокол, если он определен? Как это:

class Christmas: Merry { 
    ... 
} 

В чем разница между этими 2 методами?

+1

Нет большой разницы, первая из них просто аккуратная, так как вашему корневому классу не нужно будет обрабатывать все ошибки, вызванные функциями протокола. – rptwsthi

+1

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

+0

Возможный дубликат http://stackoverflow.com/questions/36263892/extensions-in-my-own-custom-class или http: // stackoverflow.ком/вопросы/40502086/как к должным потребительных класса-расширения-в-стрижа. –

ответ

7

Они отличаются кодирование стили. Первый вариант

class Christmas { 
    ... 
} 

extension Christmas: Merry { 
    ... 
} 

более чистый, если вы смотрите на весь класс. Вы можете сразу увидеть все реализации протокола, которым соответствует класс.

Используя второй вариант, вы помещаете реализацию протокола внутри класса, смешивая его с методами класса. Однако, если вы используете

//MARK: - 

код становится не менее чистым, чем при использовании расширений. Например:

protocol Merry: class { 
    func celebrate() 
} 

class Cristmas: NSObject, Merry { 
    private var santa: AnyObject? 

    //MARK: - Private Methods 
    private func callSanta() { 
     //calling Santa 
    } 

    //MARK: - Merry Implementation 
    func celebrate() { 
     //celebration starts here 
    } 
} 

и при взгляде на весь класс вы четко видеть разделение реализации протокола: enter image description here

Функциональность обоих вариантов является то же самое.

1

Существует разница между классами, соответствующими и extension.

На момент написания вашего class вы знали, что это должно соответствовать протоколу, тогда вы можете использовать класс, соответствующий протоколу. Однако extensions означает расширение функциональности существующих classes. После написания вашего класса и использования его в течение года вам нужно добавить дополнительную функцию в свой класс, поэтому вместо модификации класса вы можете просто расширить класс. Расширение не только для ваших классов, вы можете расширить поведение каждого класса, доступного вам (собственные фреймворки, сторонние библиотеки).

0

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

extension Christmas: Merry { 
    ... 
} 

, как это делает эти методы доступны через вне проекта с этим именем класса «Рождество»

+0

Я не понимаю, вы имеете в виду, что первый метод не «делает эти методы доступными через проект с этим названием класса« Рождество »? –

+0

есть. для примера, создание расширения для класса String сделает эти методы доступными для любого объекта класса строки во всем проекте. –

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