Почему уравновешный протокол должен быть определен за пределами класса? -- swift поле с участием hashable пол Связанный проблема

Why a equatable protocol needs to be defined outside the class?


2
vote

проблема

русский

Когда я реализую Hashable протокол. Необходимо определить функцию аналогичного протокола, чтобы определиться за пределами класса, как следует. Как следует.

 <код> func ==(lhs: Swap, rhs: Swap) -> Bool {     return (lhs.cookieA == rhs.cookieA && lhs.cookieB == rhs.cookieB) ||         (lhs.cookieB == rhs.cookieA && lhs.cookieA == rhs.cookieB) }  class Swap: Printable,Hashable {     var cookieA: Cookie     var cookieB: Cookie      init(cookieA: Cookie, cookieB: Cookie) {         self.cookieA = cookieA         self.cookieB = cookieB     }     var hashValue: Int {     return cookieA.hashValue ^ cookieB.hashValue     }      var description: String {     return "swap (cookieA) with (cookieB)"     } }   

Это просто немного странно для меня. В приведенном выше примере Func == следует принадлежать к классу своп. Так почему мы должны объявить Func == вне класса ??

Английский оригинал

When i implement the Hashable protocol. a equatable protocol function is needed to be defined outside the class as follow. As follow.

func ==(lhs: Swap, rhs: Swap) -> Bool {     return (lhs.cookieA == rhs.cookieA && lhs.cookieB == rhs.cookieB) ||         (lhs.cookieB == rhs.cookieA && lhs.cookieA == rhs.cookieB) }  class Swap: Printable,Hashable {     var cookieA: Cookie     var cookieB: Cookie      init(cookieA: Cookie, cookieB: Cookie) {         self.cookieA = cookieA         self.cookieB = cookieB     }     var hashValue: Int {     return cookieA.hashValue ^ cookieB.hashValue     }      var description: String {     return "swap (cookieA) with (cookieB)"     } } 

It is just a bit weird for me. In the above example func == should be belong to the class Swap. So why we need to declare the func == outside the class??

</div
     
 
 

Список ответов

7
 
vote
vote
Лучший ответ
 

в основном потому, что это функция , а не <сильный> метод . Функции независимы на классах, поэтому не имеет смысла обладать их вкладами в классе.

Протокол мог быть разработан с методами, например Используя <код> obj1.isEqualTo(obj2) метода, но функция менее чувствительна к <код> nil проблем. Если <код> obj1 был <код> nil , метод будет не удален.

 

Mainly because it's a function and not a method. Functions are independent on classes so it makes no sense to scope them inside class declarations.

The protocol could have been designed with methods, e.g. using a obj1.isEqualTo(obj2) method but a function is less sensitive to nil problems. If obj1 were nil, the method would fail.

</div
 
 
1
 
vote

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

 

I wouldn't read too much into it. I think it's just a simple design decision. Yes, in many languages operator overloads are methods on the left-hand-side operand and that's fine, but defining operators as functions probably gives you a bit more flexibility so they decided to make them all functions.

</div
 
 
1
 
vote

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

Я подробно ответил на этот вопрос в моем блоге post здесь . Надеюсь, это поможет.

 

The operator function is defined as a global function with a function name that matches the operator to be overloaded. The function is defined globally, rather than as a method on the target class or structure, so that it can be used as an infix operator between existing instances of the target class or structure.

I have answered this question in detail in my blog post here. Hope it helps.

</div
 
 

Связанный проблема

0  Как проверить доступность контента URL  ( How to check the content availability of a url ) 
Я создаю приложение, которое имеет <код> UITableView . Когда пользователь выбирает одну строку, она переходит на страницу содержимого, которая имеет ползунок ...

0  HLS кэширование с помощью AvassetDownloadTask  ( Hls caching using avassetdownloadtask ) 
Я следую за документацией Apple на кэшировании HLS (.m3u8) видео. https://developer.apple.com/library/archive/documentation/audiovideo/Coneptual/mediaplayb...

-2  последовательное заявление должна иметь; Ошибка в Swift  ( Consecutive statement need to have error in swift ) 
У меня есть ошибки в Swift Project, как Последовательное утверждение необходимо отделить; <код> var request: NSURLRequest(NSURL(String: "https://portal.pfs-...

0  Как выполнить Segue, который находится на UitabbarController с суббота?  ( How to perform a segue that is on a uitabbarcontroller from a sub view ) 
У меня есть UITABBACONTROLLER, который имеет Segue, который ведет к моему входит в систему. Когда пользователь смотрит на один из подзлогов, пользователь може...

1  Свифт отчетности «Дополнительный аргумент в Call» - работает на детской площадке  ( Swift reporting extra argument in call works in playground ) 
ander // Действия (строка 16) У меня есть функциональный вызов, который принимает два аргумента и возвращает две переменные. Когда я писал и проверил блок код...

0  Как использовать игрока YouTube IOS Perger с помощью use_frameworks! с какоаподами [закрыты]  ( How to use youtube ios player helper with use frameworks with cocoapods ) 
<в сторону CLASS = "S-NEWACTS S-WELTIVE__info JS-Post-New Imide MB16« Роль = «Статус»> закрыто. Этот вопрос не воспроизводится или был вызван опечаткам...

2  Как сказать SWIFT, какую функцию подпись для использования между докладами по умолчанию  ( How to tell swift which function signature to use between default optionals ) 
Я хочу создать экземпляр контроллера корневого просмотра из раскадровки, которую я создал. Для этого я привык звонить <код> -instantiateInitialViewControlle...

10  Swift 3 - UISplitViewController - Скрыть / Expand Master View в ландшафтном (например, приложение Заметки)  ( Swift 3 uisplitviewcontroller hide expand master view in landscape e g not ) 
<Р> Только начал с Swift и хотел бы повторить некоторые функциональные возможности, в приложении стандартного от Apple Notes. В частности кнопку Expand, котора...

0  Синтаксический get_video_info (информационные данные YouTube) в стрижа  ( Parsing get video info youtube information data in swift ) 
<Р> Для того, чтобы получить прямую ссылку на видео YouTube, я выполнил запрос, чтобы получить файл get_video_info, в этом файле, ссылка, но я должен разобрать...

2  Найдите каталог проекта SOURCE в SWIFT от Commited Code  ( Locate source project directory in swift from compiled code ) 
Я хочу найти каталог моего некоммерческого исходного кода (потому что я хочу считать его строки) в моем собственном проекте SWIFT. <код> let projectRepo = "...

376  Как я могу преобразовать Swift Array в строку?  ( How do i convert a swift array to a string ) 
Я знаю, как программно сделать это, но я уверен, что есть встроенный ... Каждый язык, который в котором у меня использовал, имеет какое-то текстовое предста...

1  Xcode, spritekit: Как вы включаете сложные анимации  ( Xcode spritekit how do you incorporate complex animations ) 
Я только что закончил в своей игре в Xcode и анимацию, которые у меня есть на узлах, когда уровень завершен, являются простыми озадачающимися исчезновенными а...

0  Сбой приложения после попытки загрузить 10 веб-страниц с UIWEBVIEW  ( App crashing after trying to load 10 webpages with uiwebview ) 
Я делаю приложение, где вы можете заказать еду. Я сделал это туда, где оформление заказа находится в ds2 Page на PayPal. Проблема в том, что их составляют 9...

1  Сохранить данные в зависимости от прошедшего значения в Swift  ( Save data depending on passed value in swift ) 
Я пытаюсь сэкономить время, необходимое для завершения каждого уровня. Таким образом, я ищу лучший способ сохранить данные, у меня 100 переменных для всех уро...

153  Сравнение NSDate с использованием SWIFT  ( Nsdate comparison using swift ) 
Я работаю над приложением, которое требует проверки срока выполнения домашней работы. Я хочу знать, если срок выполнения находится в течение следующей недели,...

Связанный проблема

0  Как проверить доступность контента URL 
0  HLS кэширование с помощью AvassetDownloadTask 
-2  последовательное заявление должна иметь; Ошибка в Swift 
0  Как выполнить Segue, который находится на UitabbarController с суббота? 
1  Свифт отчетности «Дополнительный аргумент в Call» - работает на детской площадке 
0  Как использовать игрока YouTube IOS Perger с помощью use_frameworks! с какоаподами [закрыты] 
2  Как сказать SWIFT, какую функцию подпись для использования между докладами по умолчанию 
10  Swift 3 - UISplitViewController - Скрыть / Expand Master View в ландшафтном (например, приложение Заметки) 
0  Синтаксический get_video_info (информационные данные YouTube) в стрижа 
2  Найдите каталог проекта SOURCE в SWIFT от Commited Code 
376  Как я могу преобразовать Swift Array в строку? 
1  Xcode, spritekit: Как вы включаете сложные анимации 
0  Сбой приложения после попытки загрузить 10 веб-страниц с UIWEBVIEW 
1  Сохранить данные в зависимости от прошедшего значения в Swift 
153  Сравнение NSDate с использованием SWIFT