<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Nikita Teslyuk on Medium]]></title>
        <description><![CDATA[Stories by Nikita Teslyuk on Medium]]></description>
        <link>https://medium.com/@tesnik?source=rss-b663c828dfb5------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*5JcFOehIegiNOij-zBX3hQ.jpeg</url>
            <title>Stories by Nikita Teslyuk on Medium</title>
            <link>https://medium.com/@tesnik?source=rss-b663c828dfb5------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Mon, 13 Jul 2026 09:42:50 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@tesnik/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com" rel="hub"/>
        <item>
            <title><![CDATA[Что такое протоколы с Associated Types?]]></title>
            <link>https://medium.com/@tesnik/%D1%87%D1%82%D0%BE-%D1%82%D0%B0%D0%BA%D0%BE%D0%B5-%D0%BF%D1%80%D0%BE%D1%82%D0%BE%D0%BA%D0%BE%D0%BB%D1%8B-%D1%81-associated-types-8065c87b6a6e?source=rss-b663c828dfb5------2</link>
            <guid isPermaLink="false">https://medium.com/p/8065c87b6a6e</guid>
            <category><![CDATA[swift]]></category>
            <category><![CDATA[objective-c]]></category>
            <category><![CDATA[protocol-oriented]]></category>
            <category><![CDATA[ios]]></category>
            <category><![CDATA[xcode]]></category>
            <dc:creator><![CDATA[Nikita Teslyuk]]></dc:creator>
            <pubDate>Sun, 17 Mar 2019 11:21:42 GMT</pubDate>
            <atom:updated>2023-11-22T08:41:30.929Z</atom:updated>
            <content:encoded><![CDATA[<p>Не так давно я посмотрел <a href="https://developer.apple.com/videos/play/wwdc2015/408/">выступление Дэйва Абрамса на WWDC 15</a> о Protocol-Oriented Programming на Swift и мне захотелось копнуть глубже и больше разобраться в этом интересном подходе.</p><p>Одним из моих камней преткновения стала такая вещь, как протоколы с Associated Types (PATs). На просторах русскоязычного комьюнити мало информации и объяснений, что же это такое и с чем это едят, поэтому я решил разобраться в этом сам.</p><h4>Что мы имеем?</h4><p>Разберём все на примере покемонов. Если вы ранее писали на Objective-C или на других объектно-ориентированных языках, то наверняка вы захотите создать класс Pokemon для того, чтобы наследоваться и иметь весь общий функционал. Поскольку каждый покемон уникальный и имеет уникальные способности (молния, вода, огонь и т. д.), мы можем воспользоваться таким мощным инструментом, как обобщения (Generics) в нашем классе:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*PufbuiCfxWX7JkfCgUTHPg.png" /></figure><p>Здесь мы смоделировали разные способности для разных покемонов:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*BOLkNMd3WXjdp_6uJ0vBMw.png" /></figure><p>Теперь другие покемоны могут наследоваться от нашего базового класса Pokemon, чтобы иметь способность атаки из коробки:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*T3GP59WgePu1AlkxvQkB1w.png" /></figure><h4>Есть проблема...</h4><p>Проблемой в этом примере является наследование. Если вы смотрели <a href="https://developer.apple.com/videos/play/wwdc2015/408/">вышеупомянутое выступление с WWDC 15</a>, то наверняка у вас в голове возникла картинка Crusty...</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/800/1*LJpvdigY7ySexRnCdG93gg.png" /><figcaption>Subclassing, huh?</figcaption></figure><p>Недостатком наследования является то, что со временем код становится громоздким и сложным, а также появляются непредвиденные ошибки (к примеру, Pokemon Eggs не имеют способности атаковать).</p><blockquote>В конце концов, Дэйв Абрамс со сцены WWDC убеждал нас в том, что <strong><em>Swift является протокол-ориентированным языком, </em></strong>поэтому нам нужно менять наш объектно-ориентированный настрой.</blockquote><h4>Привет, протоколы с Associated Types</h4><p>Давайте сделаем всё то же самое с <strong>PATs! </strong>Вместо того, чтобы наследоваться от базового класса, мы можем создать протокол, который будет отвечать за способность покемонов атаковать. Также помним, что каждый покемон уникален, поэтому нам нужно использовать дженерики:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*yAzC_IRN5XWRqdwt8-ED9Q.png" /></figure><p>Теперь любой покемон, который реализует протокол PowerTrait будет иметь функционал атаки без необходимости наследования:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*JU1djnVhDEJ7V4NKMfc-LA.png" /></figure><h4>Заключение</h4><p>Вот и всё! Протокол с associated type — это просто красивый термин для протокола с дженериками. С использованием PATs (и протоколов в целом), у нас есть мощный инструмент, который предоставляет действительно хороший функционал взамен беспорядочному наследованию.</p><p>Чтобы углубиться в это и узнать больше о PATs, рекомендую посмотреть <a href="https://www.youtube.com/watch?v=XWoNjiSPqI8">выступление Алексис Галлахер</a>.</p><p>На этом всё, до скорого!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=8065c87b6a6e" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>