<?xml version="1.0" encoding="utf-8" ?><rss version="2.0" xmlns:tt="http://teletype.in/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:media="http://search.yahoo.com/mrss/"><channel><title>CodeSwift</title><generator>teletype.in</generator><description><![CDATA[🧑🏻‍💻Только качественный контент и полезные статьи о iOS разработке.]]></description><image><url>https://img4.teletype.in/files/be/a8/bea8191a-c297-4580-9f25-d46925507b7d.png</url><title>CodeSwift</title><link>https://teletype.in/@codeswift</link></image><link>https://teletype.in/@codeswift?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=codeswift</link><atom:link rel="self" type="application/rss+xml" href="https://teletype.in/rss/codeswift?offset=0"></atom:link><atom:link rel="next" type="application/rss+xml" href="https://teletype.in/rss/codeswift?offset=10"></atom:link><atom:link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></atom:link><pubDate>Fri, 09 Oct 2026 05:18:26 GMT</pubDate><lastBuildDate>Fri, 09 Oct 2026 05:18:26 GMT</lastBuildDate><item><guid isPermaLink="true">https://teletype.in/@codeswift/31yJHEfHo4j</guid><link>https://teletype.in/@codeswift/31yJHEfHo4j?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=codeswift</link><comments>https://teletype.in/@codeswift/31yJHEfHo4j?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=codeswift#comments</comments><dc:creator>codeswift</dc:creator><title>Размеры экрана iPhone 13</title><pubDate>Tue, 28 Sep 2021 11:24:44 GMT</pubDate><media:content medium="image" url="https://img4.teletype.in/files/fc/9a/fc9abbd3-3ef5-4b52-b791-3d553863db81.png"></media:content><description><![CDATA[<img src="https://img4.teletype.in/files/74/72/7472e39b-40a8-448f-969c-bfbed5162b1a.png"></img>Четыре новых устройства iPhone 13 соответствуют размерам экранов их эквивалентов iPhone 12:]]></description><content:encoded><![CDATA[
  <h3 id="the-new-models-in-a-nutshell">В двух словах о новых моделях</h3>
  <p id="0TfP">Четыре новых устройства iPhone 13 соответствуют размерам экранов их эквивалентов iPhone 12:</p>
  <figure id="37Xe" class="m_column">
    <img src="https://img4.teletype.in/files/74/72/7472e39b-40a8-448f-969c-bfbed5162b1a.png" width="1706" />
  </figure>
  <h3 id="iphone-13">iPhone 13</h3>
  <ul id="JTHe">
    <li id="ZObA">Display: 6.1&quot; Super Retina XDR (OLED)</li>
    <li id="S5nE">Screen resolution (points): 390 x 844</li>
    <li id="p3Ff">Native resolution (pixels): 1170 x 2532 (460 ppi)</li>
    <li id="Kdb9">Native Scale factor: 3x</li>
    <li id="KwBu">Portrait size classes: w: Compact, h: Regular</li>
    <li id="7MNk">Landscape size classes: w: Compact, h: Compact</li>
  </ul>
  <figure id="WSXZ" class="m_retina">
    <img src="https://img2.teletype.in/files/93/58/93585cd1-1d95-4ddc-9df6-5c85ecc4289e.png" width="526.5" />
  </figure>
  <p id="MJ0A"><strong>status bar</strong> имеет высоту <strong>47</strong> пунктов, что дает следующие вставки <strong>safe area</strong>:</p>
  <ul id="klTc">
    <li id="N1Qk">Safe Area Insets (portrait): top: 47, bottom: 34, left: 0, right: 0</li>
    <li id="t1ik">Safe Area Insets (landscape): top: 0, bottom: 21, left: 47, right: 47</li>
  </ul>
  <h3 id="iphone-13-mini">iPhone 13 mini</h3>
  <ul id="i8Ju">
    <li id="DBQ0">Display: 5.4&quot; Super Retina XDR (OLED)</li>
    <li id="vAFn">Screen resolution (points): 375 x 812</li>
    <li id="dKzz">Native resolution (pixels): 1080 x 2340 (476 ppi)</li>
    <li id="hXiK">Native Scale factor: 2.88x</li>
    <li id="HpxI">Portrait size classes: w: Compact, h: Regular</li>
    <li id="bi8X">Landscape size classes: w: Compact, h: Compact</li>
  </ul>
  <figure id="92s8" class="m_retina">
    <img src="https://img4.teletype.in/files/31/b0/31b008a3-8907-42b4-a30e-bfeee0fe6289.png" width="503" />
  </figure>
  <p id="P7Wm"><strong>status bar</strong> имеет высоту <strong>50</strong> пунктов, что дает следующие вставки <strong>safe area</strong>:</p>
  <ul id="h2Hl">
    <li id="U0Ms">Safe Area Insets (portrait): top: 50, left: 0, bottom: 34, right: 0</li>
    <li id="ZhSA">Safe Area Insets (landscape): top: 0, left: 50, bottom: 21, right: 50</li>
  </ul>
  <h3 id="iphone-13-pro">iPhone 13 Pro</h3>
  <ul id="A5We">
    <li id="qVsk">Display: 6.1&quot; Super Retina XDR (OLED) with ProMotion</li>
    <li id="sEnu">Screen resolution (points): 390 x 844</li>
    <li id="2DdH">Native resolution (pixels): 1170 x 2532 (460 ppi)</li>
    <li id="QWMt">Scale factor: 3x</li>
    <li id="louY">Portrait size classes: w: Compact, h: Regular</li>
    <li id="cbWQ">Landscape size classes: w: Compact, h: Compact</li>
  </ul>
  <figure id="puTQ" class="m_retina">
    <img src="https://img3.teletype.in/files/a1/73/a17338e4-9c79-4aa2-874c-a6118fc6134f.png" width="526.5" />
  </figure>
  <p id="ziNs"><strong>status bar</strong> имеет высоту <strong>50</strong> пунктов, что дает следующие вставки <strong>safe area</strong>:</p>
  <ul id="4HUJ">
    <li id="8kdL">Safe Area Insets (portrait): top: 47, bottom: 34, left: 0, right: 0</li>
    <li id="INv7">Safe Area Insets (landscape): top: 0, bottom: 21, left: 47, right: 47</li>
  </ul>
  <h3 id="iphone-13-pro-max">iPhone 13 Pro Max</h3>
  <ul id="aq2b">
    <li id="qcWK">Display: 6.7&quot; Super Retina XDR (OLED) with ProMotion</li>
    <li id="8150">Screen resolution (points): 428 x 926</li>
    <li id="lymf">Native resolution (pixels): 1284 x 2778 (458 ppi)</li>
    <li id="tP1a">Scale factor: 3x</li>
    <li id="1ixJ">Portrait size classes: w: Compact, h: Regular</li>
    <li id="MjbJ">Landscape size classes: w: Regular, h: Compact</li>
  </ul>
  <figure id="UQEc" class="m_retina">
    <img src="https://img4.teletype.in/files/77/33/7733fe68-1b32-41bc-a2ec-db87ec7c14aa.png" width="561" />
  </figure>
  <p id="08CU"><strong>status bar</strong> имеет высоту <strong>47</strong> пунктов, что дает следующие вставки <strong>safe area(как в iPhone 13)</strong>:</p>
  <ul id="e3tE">
    <li id="fvow">Safe Area Insets (portrait): top: 47, bottom: 34, left: 0, right: 0</li>
    <li id="9xV0">Safe Area Insets (landscape): top: 0, bottom: 21, left: 47, right: 47</li>
  </ul>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@codeswift/eEWCqOa9VSp</guid><link>https://teletype.in/@codeswift/eEWCqOa9VSp?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=codeswift</link><comments>https://teletype.in/@codeswift/eEWCqOa9VSp?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=codeswift#comments</comments><dc:creator>codeswift</dc:creator><title>Создание красивой, отзывчивой UIButton в Swift</title><pubDate>Thu, 23 Sep 2021 03:25:15 GMT</pubDate><media:content medium="image" url="https://img2.teletype.in/files/99/33/993366c7-b579-43f7-898e-35e9fd825214.png"></media:content><description><![CDATA[<img src="https://img3.teletype.in/files/aa/79/aa79ae83-334b-4c38-8aea-abdef6cf86d7.png"></img>UIButton - один из самых любимых и ненавистных элементов управления в UIKit. Это центральный элемент практически любого приложения, но, поскольку это один из старейших классов UIKit, его иногда довольно неудобно использовать. В этой статье мы объясним, как сделать так, чтобы он не только выглядел красиво, но и как сделать его отзывчивым, чтобы мы могли радовать наших пользователей (спойлер: на самом деле это совсем несложно!). ]]></description><content:encoded><![CDATA[
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="208C">UIButton - один из самых любимых и ненавистных элементов управления в UIKit. Это центральный элемент практически любого приложения, но, поскольку это один из старейших классов UIKit, его иногда довольно неудобно использовать. В этой статье мы объясним, как сделать так, чтобы он не только выглядел красиво, но и как сделать его отзывчивым, чтобы мы могли радовать наших пользователей (спойлер: на самом деле это совсем несложно!). </p>
  </section>
  <h1 id="f400">1. “Vanilla” UIButton is very bare bones</h1>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="uo0J">Ну что ж, поиграем. Во-первых, что произойдет, если мы просто создадим «Vanilla» UIButton без конфигурации? </p>
  </section>
  <p id="YYW3"><code>let button = UIButton()<br />button.tintColor = .systemTeal<br />button.setTitle(&quot;Tap Me&quot;, for: .normal)</code></p>
  <figure id="OIAA" class="m_retina">
    <img src="https://img3.teletype.in/files/aa/79/aa79ae83-334b-4c38-8aea-abdef6cf86d7.png" width="367" />
  </figure>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="VJqY">У него нет фона, и, что удивительно, нет простого способа его добавить!  Это нормально, но справедливо предположить, что большинство приложений хотят, чтобы хотя бы некоторые из их кнопок были более смелыми, яркими и красивыми. Что-то вроде этого:</p>
  </section>
  <figure id="F76Q" class="m_retina">
    <img src="https://img3.teletype.in/files/ab/a1/aba1765b-b19c-4b5a-ad85-507c87f6d7ff.png" width="423" />
  </figure>
  <h1 id="c67e">2. Добавление цвета фона к кнопке.</h1>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="9ES0">Чтобы добавить цвет фона к нашему обычному UIButton, нам нужно будет использовать функцию setBackgroundImage (_: for :). Как видите, для его использования нам понадобится объект UIImage. Итак, мы будем использовать эту вспомогательную функцию (от команды Kickstarter) для создания однопиксельных изображений заданного цвета, которые затем мы будем использовать для установки в качестве фона для наших кнопок:</p>
  </section>
  <figure id="cpky" class="m_retina">
    <img src="https://img2.teletype.in/files/d7/db/d7db6ccd-fb5c-4e19-83cb-d676f9485b62.png" width="657" />
  </figure>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="BZgA">Отлично! Теперь применим это к нашему UIButton и посмотрим, что произойдет:</p>
  </section>
  <figure id="f1Fb" class="m_retina">
    <img src="https://img1.teletype.in/files/44/f6/44f6b2b4-946f-4017-87ff-568da2583560.png" width="659" />
  </figure>
  <figure id="derJ" class="m_original">
    <img src="https://img1.teletype.in/files/02/ae/02ae54cb-6363-4905-a09c-d52c91073348.png" width="738" />
  </figure>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="WUjE">Ладно, это уже лучше! Давайте добавим эту функцию в расширение для удобства:</p>
  </section>
  <p id="FMOI"><code>extension UIButton {<br />     func <strong>setBackgroundColor</strong>(_ backgroundColor: UIColor, for state: UIControl.State) {<br /> self.setBackgroundImage(<strong>.pixel(ofColor: backgroundColor)</strong>, for: state)<br />     }<br />}</code></p>
  <p id="SN0u"></p>
  <p id="3KHO"><code>button.<strong>setBackgroundColor</strong>(.systemBlue, for: .normal)</code></p>
  <p id="eN5O"></p>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="EDDQ">Давайте продолжим, добавив закругленные углы.</p>
  </section>
  <h1 id="3c14">3. Добавление закругленных углов</h1>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="LxHP">Что ж, это очень просто. Мы будем использовать свойство .layer.cornerRadius, которое доступно для любого подкласса UIView:</p>
  </section>
  <p id="Lm6D"></p>
  <figure id="ZsPe" class="m_retina">
    <img src="https://img4.teletype.in/files/39/30/39309927-66a3-4f9e-abb8-0c3ed5c28473.png" width="662" />
  </figure>
  <figure id="ul2q" class="m_retina">
    <img src="https://img3.teletype.in/files/ab/a1/aba1765b-b19c-4b5a-ad85-507c87f6d7ff.png" width="423" />
  </figure>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="9gmU">Прекрасно! Конечно, вы можете поиграть с точным числом, чтобы достичь желаемого радиуса угла. Не забудьте установить для .layer.masksToBounds значение true!</p>
  </section>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="hnCW">Но мы еще не закончили! Почему? Что ж, попробуем немного поиграться с нашей кнопкой:</p>
  </section>
  <figure id="Fvmf" class="m_retina">
    <img src="https://img3.teletype.in/files/69/a9/69a90f3c-749e-424d-a832-add7e843073b.gif" width="369" />
  </figure>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="q0hD">Нуу, это выглядит нормально, и на самом деле большинство приложений просто так и оставят. Но на самом деле мы можем добиться большего почти без усилий!</p>
  </section>
  <h1 id="c1e2">4. Как сделать кнопку более отзывчивой</h1>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="T4GF">Секрет заключается в том, что называется UIButton.ButtonType. Когда вы просто создаете кнопку с помощью инициализатора UIButton (), он создаст ее с типом кнопки .custom. Однако, используя тип кнопки .system, вы получите гораздо более плавную, игривую и отзывчивую анимацию! Просто посмотрите, это волшебно:</p>
  </section>
  <figure id="FziL" class="m_retina">
    <img src="https://img2.teletype.in/files/d7/4d/d74deb41-54dc-43a0-bacd-10ff6d897cf5.png" width="657.5" />
  </figure>
  <figure id="gth4" class="m_retina">
    <img src="https://img3.teletype.in/files/e1/69/e1696f4a-96c9-49c7-a5c3-80b284c51cdc.gif" width="366" />
  </figure>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="y9gJ">Вот так, намного лучше. Это становится особенно ясно, когда вы используете это на физическом устройстве. Он очень интуитивно понятен - он плавно анимируется в зависимости от того, быстро ли вы нажимаете на него или держите на нем палец. </p>
  </section>
  <h1 id="f58a">5. Поддержка темного режима.</h1>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="9IPu">Некоторое время мы использовали вспомогательную функцию Kickstarter для создания фоновых изображений размером 1 пиксель, но, начиная с iOS 13, мы заметили некоторые проблемы при переключении из светлого режима в темный или наоборот. Допустим, у нас есть кнопка, на которой должен быть черный фон и белый текст в светлом режиме, а также белый фон и черный текст в темном режиме:</p>
  </section>
  <figure id="0IyU" class="m_retina">
    <img src="https://img2.teletype.in/files/16/87/16875cf5-bd96-4942-95e0-bec130de6fbf.png" width="669" />
  </figure>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="sfex">Что произойдет, если мы перейдем из светлого режима в темный во время работы приложения?</p>
  </section>
  <figure id="zlHR" class="m_retina">
    <img src="https://img2.teletype.in/files/dc/c8/dcc850c5-7123-48a1-8ce2-736ceac22444.gif" width="419" />
  </figure>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="MYmQ">Ух, это нехорошо. Чтобы решить эту проблему, мы изменили вспомогательную функцию Kickstarter для создания фоновых изображений размером 1 пиксель с правильной поддержкой светлого и темного режимов (просто скопируйте и вставьте):</p>
  </section>
  <p id="HbXR"><code>extension UIImage {</code></p>
  <p id="Gy0w"><code> static func pixel(ofColor color: UIColor) -&gt; UIImage {<br /><br /> let lightModeImage = UIImage.generatePixel(ofColor: color, userInterfaceStyle: .light)<br /><br /> let darkModeImage = UIImage.generatePixel(ofColor: color, userInterfaceStyle: .dark)<br /><br /> <strong>lightModeImage.imageAsset?.register(darkModeImage, with: UITraitCollection(userInterfaceStyle: .dark))<br /><br /></strong> return lightModeImage<br /><br /> }</code></p>
  <p id="OQpO"><code> static private func generatePixel(ofColor color: UIColor, userInterfaceStyle: UIUserInterfaceStyle) -&gt; UIImage {<br /><br /> var image: UIImage!<br /><br /> <strong>if #available(iOS 13.0, *) { UITraitCollection(userInterfaceStyle: userInterfaceStyle).performAsCurrent { image = .generatePixel(ofColor: color) } }</strong> else {<br /><br /> image = .generatePixel(ofColor: color)<br /> }<br /><br /> return image<br /> }</code></p>
  <p id="MTaK"><code> static private func generatePixel(ofColor color: UIColor) -&gt; UIImage {<br /> let pixel = CGRect(x: 0.0, y: 0.0, width: 1.0, height: 1.0)</code></p>
  <p id="xQzn"><code> UIGraphicsBeginImageContext(pixel.size)<br /> defer { UIGraphicsEndImageContext() }</code></p>
  <p id="Lk8Y"><code> guard let context = UIGraphicsGetCurrentContext() else {<br /> return UIImage()<br /> }</code></p>
  <p id="sbo5"><code> context.setFillColor(color.cgColor)<br /> context.fill(pixel)</code></p>
  <p id="GvhM"><code> return UIGraphicsGetImageFromCurrentImageContext() ?? UIImage()<br />    }<br />}</code></p>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="T2K9">Теперь работает безотказно!</p>
  </section>
  <figure id="lujj" class="m_retina">
    <img src="https://img3.teletype.in/files/a1/07/a1070c69-0492-4100-80a2-9a17ce56af23.gif" width="421" />
  </figure>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="o6V5">Мы использовали эту модифицированную версию во всех наших последних проектах и не испытывали никаких проблем.</p>
  </section>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="g44z">Надеемся, статья была вам полезна)</p>
  </section>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@codeswift/9MpBgSXfuJl</guid><link>https://teletype.in/@codeswift/9MpBgSXfuJl?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=codeswift</link><comments>https://teletype.in/@codeswift/9MpBgSXfuJl?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=codeswift#comments</comments><dc:creator>codeswift</dc:creator><title>Swift 5.5</title><pubDate>Wed, 22 Sep 2021 10:26:57 GMT</pubDate><description><![CDATA[Swift 5.5 - это массовый выпуск, который включает недавно представленные языковые возможности для параллелизма, включая async / await, структурированный параллелизм и акторы.]]></description><content:encoded><![CDATA[
  <p id="AeBp">Swift 5.5 - это массовый выпуск, который включает недавно представленные языковые возможности для параллелизма, включая async / await, структурированный параллелизм и акторы.</p>
  <p id="2tUw"></p>
  <p id="eU5v"><strong>Смотрите на YouTube:</strong></p>
  <p id="VcPZ">Что нового в Swift 5.5 - <a href="https://www.youtube.com/watch?v=6C0SFPEy_0Y" target="_blank">https://www.youtube.com/watch?v=6C0SFPEy_0Y</a></p>
  <p id="0hjM"></p>
  <p id="DFpA">В процессе Swift Evolution был внесен ряд изменений для включения в Swift 5.5:</p>
  <ul id="X8Un">
    <li id="OXnC"> <a href="https://github.com/apple/swift-evolution/blob/main/proposals/0291-package-collections.md" target="_blank">Package Collections</a></li>
    <li id="wpAx"> <a href="https://github.com/apple/swift-evolution/blob/main/proposals/0293-extend-property-wrappers-to-function-and-closure-parameters.md" target="_blank">Extend Property Wrappers to Function and Closure Parameters</a></li>
    <li id="2mlG"> <a href="https://github.com/apple/swift-evolution/blob/main/proposals/0295-codable-synthesis-for-enums-with-associated-values.md" target="_blank">Codable synthesis for enums with associated values</a></li>
    <li id="iCRJ"> <a href="https://github.com/apple/swift-evolution/blob/main/proposals/0296-async-await.md" target="_blank">Async/await</a></li>
    <li id="E1sX"> <a href="https://github.com/apple/swift-evolution/blob/main/proposals/0297-concurrency-objc.md" target="_blank">Concurrency Interoperability with Objective-C</a></li>
    <li id="PkMX"> <a href="https://github.com/apple/swift-evolution/blob/main/proposals/0298-asyncsequence.md" target="_blank">Async/Await: Sequences</a></li>
    <li id="DjKC"> <a href="https://github.com/apple/swift-evolution/blob/main/proposals/0299-extend-generic-static-member-lookup.md" target="_blank">Extending Static Member Lookup in Generic Contexts</a></li>
    <li id="NHZN"> <a href="https://github.com/apple/swift-evolution/blob/main/proposals/0300-continuation.md" target="_blank">Continuations for interfacing async tasks with synchronous code</a></li>
    <li id="H2Ks"> <a href="https://github.com/apple/swift-evolution/blob/main/proposals/0304-structured-concurrency.md" target="_blank">Structured concurrency</a></li>
    <li id="IhwR"> <a href="https://github.com/apple/swift-evolution/blob/main/proposals/0306-actors.md" target="_blank">Actors</a></li>
    <li id="8pSV"> <a href="https://github.com/apple/swift-evolution/blob/main/proposals/0307-allow-interchangeable-use-of-double-cgfloat-types.md" target="_blank">Allow interchangeable use of CGFloat and Double types</a></li>
    <li id="BBN8"> <a href="https://github.com/apple/swift-evolution/blob/main/proposals/0308-postfix-if-config-expressions.md" target="_blank">if for postfix member expressions</a></li>
    <li id="II4V"> <a href="https://github.com/apple/swift-evolution/blob/main/proposals/0310-effectful-readonly-properties.md" target="_blank">Effectful Read-only Properties</a></li>
    <li id="IcBu"> <a href="https://github.com/apple/swift-evolution/blob/main/proposals/0311-task-locals.md" target="_blank">Task Local Values</a></li>
    <li id="8d8V"> <a href="https://github.com/apple/swift-evolution/blob/main/proposals/0313-actor-isolation-control.md" target="_blank">Improved control over actor isolation</a></li>
    <li id="PxUZ"> <a href="https://github.com/apple/swift-evolution/blob/main/proposals/0314-async-stream.md" target="_blank">AsyncStream and AsyncThrowingStream</a></li>
    <li id="f7it"> <a href="https://github.com/apple/swift-evolution/blob/main/proposals/0316-global-actors.md" target="_blank">Global actors</a></li>
    <li id="09s3"> <a href="https://github.com/apple/swift-evolution/blob/main/proposals/0317-async-let.md" target="_blank">async let bindings</a></li>
    <li id="Ba34"> <a href="https://github.com/apple/swift-evolution/blob/main/proposals/0319-never-identifiable.md" target="_blank">Conform Never to Identifiable</a></li>
  </ul>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@codeswift/PcfaEmlydEg</guid><link>https://teletype.in/@codeswift/PcfaEmlydEg?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=codeswift</link><comments>https://teletype.in/@codeswift/PcfaEmlydEg?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=codeswift#comments</comments><dc:creator>codeswift</dc:creator><title>Изменения представления стека в iOS 15</title><pubDate>Mon, 20 Sep 2021 17:23:57 GMT</pubDate><media:content medium="image" url="https://img2.teletype.in/files/93/44/934473f6-d4f9-4b3e-8e12-eb3bf2f6c44e.png"></media:content><description><![CDATA[<img src="https://img2.teletype.in/files/11/a6/11a6efa7-1d0b-4e7b-b77c-70dfe2b83211.png"></img>Одна из вещей, которая всегда раздражала меня в представлениях стека, - это недокументированное и неожиданное поведение. Взгляните на этот пример. У меня есть многострочная метка и переключатель в виде горизонтального стека.]]></description><content:encoded><![CDATA[
  <h3 id="stack-view-fill-distribution">Stack View Fill Distribution</h3>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="pQSk">Одна из вещей, которая всегда раздражала меня в представлениях стека, - это недокументированное и неожиданное поведение. Взгляните на этот пример. У меня есть многострочная метка и переключатель в виде горизонтального стека.</p>
  </section>
  <figure id="Q3yz" class="m_retina">
    <img src="https://img2.teletype.in/files/11/a6/11a6efa7-1d0b-4e7b-b77c-70dfe2b83211.png" width="420" />
  </figure>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="y0nz"><strong>Stack view</strong> использует распределение заливки и выравнивание по центру. При распределении заливки <strong>Stack view</strong> растягивается или сжимается, чтобы заполнить доступную ширину. Автоматическая компоновка решает, какой вид сжать первым, сравнивая приоритеты сопротивления сжатию содержимого. Вид с самым низким приоритетом будет сжат.</p>
  </section>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="N2xQ">Поскольку и метка, и переключатель имеют приоритет горизонтального сопротивления сжатию по умолчанию 750, эта компоновка должна быть неоднозначной. Используя Xcode 13, <strong>Interface Builder</strong> действительно сообщает о проблеме с отсутствующими ограничениями:</p>
  </section>
  <figure id="wS80" class="m_retina">
    <img src="https://img2.teletype.in/files/13/27/1327364e-bf4a-4df7-a5ee-c61f872ac4a4.png" width="330" />
  </figure>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="oPHc"><strong>Interface Builder</strong> здесь вводит в заблуждение. Проблема не в отсутствии ограничений. Я хочу сжать этикетку перед переключателем, поэтому мне нужно снизить приоритет сопротивления сжатию этикетки до 749:</p>
  </section>
  <figure id="o0w6" class="m_retina">
    <img src="https://img3.teletype.in/files/a4/8c/a48c883b-3c37-4730-ac0c-ae370204f9cc.png" width="250" />
  </figure>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="hSnb">Это здорово, работает так, как я ожидал, так в чем проблема? Вот как это выглядит, если я использую тот же макет на iOS 14 (или более ранней версии) по сравнению с iOS 15:</p>
  </section>
  <figure id="BsMh" class="m_retina">
    <img src="https://img1.teletype.in/files/45/f6/45f6be65-b895-4b4a-998e-f44cce65152e.png" width="585.5" />
  </figure>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="3aZz">Running on iOS 14 the label and the switch are both sized to half the available width. Lowering the priority to 749 has not had the expected effect.</p>
  </section>
  <h3 id="disambiguation-constraints">Disambiguation Constraints</h3>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="5UBl">Вот как ограничения выглядят в отладчике представления при работе на iOS 14.5. Ограничение UISV-text-width-disambiguation вызывает непредвиденное поведение. Он имеет приоритет 759 и хочет сделать ширину метки равной половине ширины представления стека:</p>
  </section>
  <figure id="D6iq" class="m_retina">
    <img src="https://img4.teletype.in/files/38/43/3843bb60-e84c-4bae-b7ce-24756504660c.png" width="580" />
  </figure>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="bZe6">Переключатель имеет приоритеты объятий и сжатия 750, ограничение разрешения имеет приоритет.. Вот как выглядят ограничения для одного и того же макета на iOS 15:</p>
  </section>
  <figure id="6YjJ" class="m_retina">
    <img src="https://img4.teletype.in/files/3e/c9/3ec9e08d-00a9-4958-92a0-720b248c57b7.png" width="580" />
  </figure>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="NtGB">Одно из решений заключается в увеличении приоритета перехода к контенту до 760 или выше.</p>
  </section>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@codeswift/-Q2PiHezCZu</guid><link>https://teletype.in/@codeswift/-Q2PiHezCZu?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=codeswift</link><comments>https://teletype.in/@codeswift/-Q2PiHezCZu?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=codeswift#comments</comments><dc:creator>codeswift</dc:creator><title>5 лучших трюков Xcode</title><pubDate>Thu, 16 Sep 2021 22:07:51 GMT</pubDate><media:content medium="image" url="https://img1.teletype.in/files/06/a8/06a87a6a-bea7-43a2-9cd2-8ec4c25c10f7.png"></media:content><description><![CDATA[<img src="https://img3.teletype.in/files/a9/a8/a9a8a576-f7d5-4115-9a85-4ebce02c28d0.png"></img>В Xcode Apple предоставляет множество функций, которые могут помочь повысить производительность труда разработчиков и упростить отладку. Ниже приведены 5 основных функций Xcode, которые помогают мне в повседневном рабочем процессе разработки iOS:]]></description><content:encoded><![CDATA[
  <section style="background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="SgOa">В Xcode Apple предоставляет множество функций, которые могут помочь повысить производительность труда разработчиков и упростить отладку. Ниже приведены 5 основных функций Xcode, которые помогают мне в повседневном рабочем процессе разработки iOS:</p>
  </section>
  <h1 id="b795">1. Медленная анимация</h1>
  <section style="background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="7ZSF">Тестирование анимации может быть сложной задачей. К счастью, в Xcode есть функция, которая замедляет анимацию в симуляторе, так что вы можете точно видеть, как ваши представления перемещаются или меняются. Чтобы включить эту функцию, просто запустите свое приложение, войдя в симулятор, нажмите «<em>Debug</em>» в верхнем меню, а затем выберите «<em>Slow animations</em>».</p>
  </section>
  <figure id="MC8x" class="m_retina">
    <img src="https://img3.teletype.in/files/a9/a8/a9a8a576-f7d5-4115-9a85-4ebce02c28d0.png" width="275" />
  </figure>
  <section style="background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="7oZm">Теперь, когда вы используете свое приложение в симуляторе, вы должны увидеть, как медленно перемещаются представления. Вот пример, показывающий, как расширяемая кнопка медленно расширяется и сжимается:</p>
  </section>
  <figure id="CVxJ" class="m_retina">
    <img src="https://img3.teletype.in/files/23/01/230157cf-0847-4d8b-a67d-b36b3283ca36.gif" width="225" />
  </figure>
  <h1 id="1438">2. Просмотр отладки кадра</h1>
  <section style="background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="yOFb">Иногда мы хотим убедиться, что виды правильно выровнены или находятся в пределах определенного фрейма. Это может быть сложно, особенно когда представления становятся более сложными. Xcode позволяет просматривать отладку, позволяя вам видеть все фреймы представлений вашего приложения. Чтобы использовать эту функцию, сначала запустите ваше приложение; затем в Xcode перейдите в меню «<em>Debug</em>», затем в подменю «<em>View Debugging</em>» и выберите «<em>Show View Frames</em>».</p>
  </section>
  <figure id="v5EO" class="m_retina">
    <img src="https://img1.teletype.in/files/02/35/0235593f-99bb-4745-86aa-f5e585340d2e.png" width="275" />
  </figure>
  <p id="OGes">Теперь, когда вы используете свое приложение в симуляторе, оно будет отображать ваши представления с цветными рамками.</p>
  <figure id="sj5L" class="m_retina">
    <img src="https://img1.teletype.in/files/8a/b1/8ab1c5d0-61ac-4f4c-8641-8c6db4f39391.png" width="250" />
  </figure>
  <p id="vOcM">Вы по-прежнему можете взаимодействовать со своим приложением, и цветные рамки будут отображаться даже при переходе к другим представлениям.</p>
  <figure id="wKMe" class="m_retina">
    <img src="https://img4.teletype.in/files/bd/9f/bd9fb71e-bc58-421d-965e-d83cfa6fb396.gif" width="225" />
    <figcaption>Использование приложения в симуляторе с включенной отладкой кадра обзора.</figcaption>
  </figure>
  <h1 id="824e">3. Просмотр отладки иерархии</h1>
  <section style="background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="lJeg">Просмотр иерархии представлений вашего приложения также может быть полезен во время отладки пользовательского интерфейса; это может быть особенно полезно, когда вид, который вы ожидаете увидеть, по какой-то причине скрыт. Xcode позволяет вам видеть трехмерное представление вашего приложения, показывающее, как ваши представления и подпредставления расположены вдоль оси z. Чтобы использовать эту функцию, вы должны сначала запустить приложение, а затем в нижней области отладки нажмите Debug View Hierarchy (вы также можете сделать это, перейдя в меню Debug, затем в подменю View Debugging и выбрав Capture View Hierarchy).</p>
  </section>
  <figure id="sjbk" class="m_retina">
    <img src="https://img3.teletype.in/files/21/d0/21d0a5ff-8353-450c-8846-6529a92b4df5.png" width="700" />
  </figure>
  <section style="background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="NxjZ">После загрузки иерархии представлений Xcode покажет представление, подобное приведенному ниже. Вы можете щелкнуть и переместить представление приложения, чтобы увидеть расположение всех представлений и вложенных представлений.</p>
  </section>
  <section style="background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="WmdK">В левой части Xcode вы можете увидеть навигатор; это показывает вашу иерархию представлений в виде контура, который вы можете разворачивать и сворачивать. Кроме того, восклицательный знак указывает на то, что у вашего подпредставления (-ов) есть проблема, обычно связанная с ограничениями автоматической компоновки. Если навести указатель мыши на восклицательный знак, можно понять, в чем проблема.</p>
  </section>
  <figure id="GZZ3" class="m_retina">
    <img src="https://img2.teletype.in/files/97/76/9776ebcf-417b-4680-9efe-dbcbc673e996.png" width="576" />
  </figure>
  <section style="background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="FcU0">Еще одна полезная функция в <em>View Hierarchy Debug</em> - это возможность видеть обрезанный контент, то есть контент, который является частью иерархии представлений, но в настоящее время не расположен в видимой области вашего приложения. Чтобы включить это, просто нажмите кнопку «<em>Show Clipped Content</em>» в нижнем меню.</p>
  </section>
  <figure id="mPck" class="m_retina">
    <img src="https://img1.teletype.in/files/0c/ce/0cce1bca-6a74-48ef-aab0-7e213886c5ab.gif" width="225" />
  </figure>
  <h1 id="2348">4. Ярлык для добавления и использования документации</h1>
  <section style="background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="2NaN">Написание четкой документации - неотъемлемая часть жизненного цикла разработки программного обеспечения. Документация по исходному коду помогает объяснить, что делает написанный код и как он себя ведет. Эта документация полезна не только для людей, не знакомых с кодом, но и для будущего автора кода.</p>
  </section>
  <section style="background-color:hsl(hsl(236, 74%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="BZBB">Xcode позволяет использовать следующий ярлык для немедленного создания документации для метода: ⌥ + ⌘ + / (Option + Command + Slash).</p>
  </section>
  <figure id="l5Za" class="m_column">
    <img src="https://img2.teletype.in/files/1e/1f/1e1ff9c3-f735-4703-83b5-7f7106c86f1c.gif" width="600" />
  </figure>
  <section style="background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="1lGn">Кроме того, вы можете использовать клавишу выбора (⌥) при наведении курсора на свой код, и всякий раз, когда информация о нем доступна, ваш курсор превратится в вопросительный знак. Щелкните, и вы увидите всплывающее окно документации, например:</p>
  </section>
  <figure id="JwGI" class="m_column">
    <img src="https://img4.teletype.in/files/32/85/3285c710-b2e2-4a2e-b11a-f626a2fda3ca.gif" width="600" />
  </figure>
  <p id="Y1et">Вы также можете использовать клавишу выбора, чтобы просмотреть документацию по API Apple.</p>
  <figure id="ODqM" class="m_original">
    <img src="https://img1.teletype.in/files/8c/eb/8cebf650-81b7-463a-bf57-541d5602f66d.gif" width="600" />
  </figure>
  <h1 id="6de1">5. Переименование классов или переменных</h1>
  <section style="background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="6P8z">Переименование класса или переменной может стать утомительной задачей, если вы уже использовали его в нескольких местах кода. К счастью, в Xcode есть функция переименования, которая упрощает нашу жизнь. Допустим, вы хотите переименовать класс, вы можете легко переименовать его везде, где он используется, нажав командную клавишу (⌘), щелкнув класс, который вы хотите переименовать, а затем выбрав «Переименовать…» в параметрах меню.</p>
  </section>
  <section style="background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="NMFk">Xcode покажет вам все места, где используется класс, и вы можете переименовать их все за один раз.</p>
  </section>
  <figure id="a0ci" class="m_column">
    <img src="https://img4.teletype.in/files/79/07/790754fe-d1e9-447a-aaf2-61da2652e2f1.gif" width="800" />
  </figure>
  <p id="QTl9">Спасибо за прочтение! Я надеюсь, что эти уловки помогут улучшить вашу работу в качестве разработчика iOS. Пожалуйста, поделитесь любыми другими советами или приемами Xcode в комментарии.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@codeswift/BrVbKnV3oxu</guid><link>https://teletype.in/@codeswift/BrVbKnV3oxu?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=codeswift</link><comments>https://teletype.in/@codeswift/BrVbKnV3oxu?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=codeswift#comments</comments><dc:creator>codeswift</dc:creator><title>Сокращенные имена параметров</title><pubDate>Tue, 14 Sep 2021 17:32:58 GMT</pubDate><media:content medium="image" url="https://img3.teletype.in/files/24/7e/247e9fda-ef81-4645-9af0-cb892e5ed8e8.png"></media:content><description><![CDATA[<img src="https://img2.teletype.in/files/58/5e/585e9c8c-158a-4cad-9620-e1a334d25010.png"></img>Мы только что сделали функцию travel(). Он принимает один параметр, который является замыканием, которое само принимает один параметр и возвращает строку. Затем это замыкание выполняется между двумя вызовами print().]]></description><content:encoded><![CDATA[
  <figure id="22Nb" class="m_column">
    <img src="https://img2.teletype.in/files/58/5e/585e9c8c-158a-4cad-9620-e1a334d25010.png" width="2880" />
  </figure>
  <section style="background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="yzQG">Мы только что сделали функцию <code>travel()</code>. Он принимает один параметр, который является замыканием, которое само принимает один параметр и возвращает строку. Затем это замыкание выполняется между двумя вызовами <code>print()</code>.</p>
    <p id="O3bf">Вот что в коде:</p>
  </section>
  <section style="background-color:hsl(hsl(236, 74%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <pre id="sdqh">func travel(action: (String) -&gt; String) {
    print(&quot;I&#x27;m getting ready to go.&quot;)
    let description = action(&quot;London&quot;)
    print(description)
    print(&quot;I arrived!&quot;)
}</pre>
  </section>
  <section style="background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="E3WV">Мы можем вызвать <code>travel()</code>, используя что-то вроде этого:</p>
  </section>
  <section style="background-color:hsl(hsl(236, 74%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <pre id="T9eE">travel { (place: String) -&gt; String in
    return &quot;I&#x27;m going to \(place) in my car&quot;
}</pre>
  </section>
  <section style="background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="bWCD">Тем не менее, Swift <em>знает</em>, что параметром для этого замыкания должна быть строка, поэтому мы можем удалить его:</p>
  </section>
  <section style="background-color:hsl(hsl(236, 74%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <pre id="9wXx">travel { place -&gt; String in
    return &quot;I&#x27;m going to \(place) in my car&quot;
}</pre>
  </section>
  <section style="background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="lGsu">Он также знает, что замыкание должно возвращать строку, поэтому мы можем удалить это:</p>
  </section>
  <section style="background-color:hsl(hsl(236, 74%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <pre id="whtv">travel { place in
    return &quot;I&#x27;m going to \(place) in my car&quot;
}</pre>
  </section>
  <section style="background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="VOhF">Поскольку замыкание имеет только одну строку кода, которая должна быть той, которая возвращает значение, поэтому Swift позволяет нам также удалить ключевое слово <code>return</code>:</p>
  </section>
  <section style="background-color:hsl(hsl(236, 74%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <pre id="FwgV">travel { place in
    &quot;I&#x27;m going to \(place) in my car&quot;
}</pre>
  </section>
  <section style="background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="QhUh">Swift имеет сокращенный синтаксис, который позволяет вам работать еще короче. Вместо того, чтобы писать место внутри, мы можем позволить Swift автоматически указывать имена для параметров закрытия. Они называются со знаком доллара, а затем с числа, отсчитываемого от 0.</p>
  </section>
  <section style="background-color:hsl(hsl(236, 74%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <pre id="MyOI">travel {
    &quot;I&#x27;m going to \($0) in my car&quot;
}</pre>
  </section>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@codeswift/SeIOJ-jbhyS</guid><link>https://teletype.in/@codeswift/SeIOJ-jbhyS?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=codeswift</link><comments>https://teletype.in/@codeswift/SeIOJ-jbhyS?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=codeswift#comments</comments><dc:creator>codeswift</dc:creator><title>Вещи, которые я хотел бы знать в своей ранней карьере программиста</title><pubDate>Wed, 08 Sep 2021 20:49:47 GMT</pubDate><description><![CDATA[В течение последних нескольких лет у меня была возможность наставлять новых участников на разных должностях. В некоторых аспектах я мог видеть себя в них,  я так же начинал много лет назад: стремясь проявить себя.
Я попытался подумать о том, чему я научился на собственном горьком опыте с момента моей первой работы в технологической индустрии, и как я могу помочь им облегчить их путь.]]></description><content:encoded><![CDATA[
  <section style="background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="MF55">В течение последних нескольких лет у меня была возможность наставлять новых участников на разных должностях. В некоторых аспектах я мог видеть себя в них,  я так же начинал много лет назад: стремясь проявить себя.<br />Я попытался подумать о том, чему я научился на собственном горьком опыте с момента моей первой работы в технологической индустрии, и как я могу помочь им облегчить их путь.</p>
  </section>
  <h2 id="take-your-time-to-learn">Не торопитесь учиться</h2>
  <section style="background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="VFWd">Французское образование, к сожалению, не известно своим превосходным преподаванием английского языка, поэтому просмотр страниц документации на английском языке был для меня чуждым.</p>
    <p id="HNh6">Я наивно думал, что смогу обойтись без этого руководства. Я научился программировать без него, насколько это может быть трудно? Речь шла о том, чтобы пытаться снова и снова, пока я не разобрался.</p>
    <p id="7vuS">Мой подход был совершенно неправильным, кодирование - это не игра в угадывание. Если вы потратите больше времени на закрепление основ, вы станете лучшим инженером. К сожалению, сегодня большая часть документации на английском языке, поэтому не говорящим по-английски придется усвоить это, прежде чем перейти к содержательной части обучения.</p>
    <p id="iRHO">То же самое относится к некоторым основам информатики, таким как алгоритмы или структуры данных. Некоторые могут наивно думать, что это требуется только для получения оценок в университете, но при этом упускается важный момент: большинство проблем с кодированием можно свести к известным алгоритмам или структуре данных.</p>
    <p id="IZQo">Это также очень распространенная тема во время технических собеседований, и поверьте мне, довольно сложно вернуться к ней, если вы ее пропустили.</p>
    <p id="QlXD">Важно иметь прочную основу, это как набор инструментов, вы знаете, какой из них использовать, когда столкнетесь с проблемой. Вы избежите множества ошибок и связанных с этим разочарований.</p>
  </section>
  <h2 id="its-okay-to-not-know">Это нормально - Не знать</h2>
  <section style="background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="QGGq">Я встретил молодых инженеров, которые беспокоились о том, что не знают «все» для своей должности при приходе в компанию. Итак, позвольте мне сказать вам кое-что: обучение - это большая часть работы, технологии меняются настолько быстро, чтобы можно было наверстать упущенное и знать все.</p>
    <p id="j9Bz">Я считаю, что именно поэтому так много инженеров делятся своими знаниями и выводами в блогах и книгах, чтобы помочь другим наверстать упущенное.<br />Так что незнание «всего» - не проблема, ключ в том, чтобы знать, как найти знания, которых вам не хватает. </p>
  </section>
  <section style="background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="dk0b"><br />Я перейду к поиску в Google - копаться в ответах на StackOverflow, но как насчет языковой документации? Есть ли технические книги, к которым вы можете получить доступ? Есть ли доступные видео по этой теме с предыдущих WWDC или Youtube? Может быть, вам повезло и на нем есть подкаст?</p>
    <p id="5D5E">Ничего не найдено? Не сдавайся. Вы можете пробовать и пробовать.<br />Повторное обучение - это навык, который поможет вам справиться с любой работой.<br /></p>
  </section>
  <h2 id="focus-on-your-craft-not-your-job-title">Сосредоточьтесь на своем деле, а не на должности</h2>
  <section style="background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="OHjY">Когда я начинал, я чувствовал, что название должности означает все. Насколько здорово было бы быть старшим инженером-программистом, или персоналом, менеджером или даже техническим директором? Я потратил слишком много времени на беспокойство о том, как прогрессировать в своей организации, вместо того, чтобы сосредоточиться на наборе навыков.</p>
  </section>
  <section style="background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="rozS">Не поймите меня неправильно, должность имеет значение, но не так уж важно, как вы думаете.</p>
  </section>
  <section style="background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="qTrh"><br />Во-первых, каждая должность зависит от компании, в которой вы работаете. В каждой организации свой карьерный рост, и они по-разному оценивают прогресс. </p>
  </section>
  <section style="background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="gPKf">Во-вторых, ваша должность может довольно быстро измениться в начале вашей карьеры. Переход от младшего разработчика к среднему может занять пару лет, а может и меньше. Не ждите такой же скорости позже. Каждый титул связан с обязанностями и ожиданиями, на изучение и освоение некоторых требуются годы. Так что еще раз - не торопитесь.</p>
  </section>
  <section style="background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="rBfr">Это то же самое, что бег, сосредоточьтесь на своей форме, а не на темпе. Когда вы приобретете хорошую технику, за ним последует скорость.</p>
  </section>
  <h2 id="tY3J">Заключение</h2>
  <section style="background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="best-practices-doesnt-mean-latest-trending-tools">В конце концов, на мой взгляд, обучение и повторное обучение - это навык, требующий времени. Нет никакого ярлыка, чтобы стать лучшим инженером, сосредоточиться на своем деле, не торопиться, чтобы понять, что вы делаете, и эта преданность деталям будет иметь значение. И в итоге, это окупится и откроет для вас любые двери.</p>
  </section>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@codeswift/6-2xu0FdYN5</guid><link>https://teletype.in/@codeswift/6-2xu0FdYN5?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=codeswift</link><comments>https://teletype.in/@codeswift/6-2xu0FdYN5?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=codeswift#comments</comments><dc:creator>codeswift</dc:creator><title>Генерация кода в Swift</title><pubDate>Tue, 07 Sep 2021 23:12:41 GMT</pubDate><description><![CDATA[Работая над проектом iOS, вы довольно часто пишете шаблонный код. Это код, который вы предпочитаете не писать от руки и чаще всего - копировать и вставлять. Это может привести к определенным ошибкам и даже сбоям во время выполнения. В этой ситуации может быть полезна генерация кода. Это позволяет генерировать скучный и повторяющийся код и делать приложение более надежным.]]></description><content:encoded><![CDATA[
  <section style="background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="c310">Работая над проектом iOS, вы довольно часто пишете шаблонный код. Это код, который вы предпочитаете не писать от руки и чаще всего - копировать и вставлять. Это может привести к определенным ошибкам и даже сбоям во время выполнения. В этой ситуации может быть полезна генерация кода. Это позволяет генерировать скучный и повторяющийся код и делать приложение более надежным.</p>
    <p id="ef9d">В этом посте давайте рассмотрим сценарии использования, когда генерация кода имеет смысл, и рассмотрим инструменты, которые мы можем использовать для его автоматизации.</p>
  </section>
  <h1 id="3c5f"><strong>Сценарии использования генерации кода</strong></h1>
  <section style="background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="f5a5">Генерация кода не является новой техникой и используется уже во многих проектах Android, Golang и т. д. Возможно, вы уже используете <a href="https://github.com/krzysztofzablocki/Sourcery" target="_blank">Sourcery </a>в своем проекте, это популярный инструмент для генерации кода и метапрограммирования в Swift.</p>
    <p id="6124">Прежде всего, давайте определим наиболее распространенные сценарии использования для генерации кода:</p>
  </section>
  <ul id="e6Sh">
    <li id="e87c"><a href="https://github.com/krzysztofzablocki/Sourcery" target="_blank">Sourcery</a></li>
    <li id="00fc"><a href="https://github.com/Brightify/Cuckoo" target="_blank">Cuckoo</a></li>
    <li id="795a"><a href="https://github.com/uber/mockolo" target="_blank">Mockolo</a></li>
    <li id="b65a"><a href="https://github.com/MakeAWishFoundation/SwiftyMocky" target="_blank">SwiftyMocky</a></li>
  </ul>
  <section style="background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="gtr3">С их помощью вы можете автоматизировать написание и обслуживание имитационных реализаций, которые вы сделали вручную.</p>
  </section>
  <h2 id="a71d"><strong>Dependency Injection</strong></h2>
  <section style="background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="HfAm"><a href="https://www.martinfowler.com/articles/injection.html" target="_blank">Dependency Injection </a>является одним из фундаментальных паттернов разработки программного обеспечения. Он представляет технику инверсии управления для предоставления зависимостей классу через конструктор, общедоступное свойство или функцию установки.</p>
  </section>
  <h2 id="a711"><strong>Модели DTO</strong></h2>
  <section style="background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="NlEB">Довольно часто при интеграции с RESTful API вам приходится определять множество <a href="https://en.wikipedia.org/wiki/Data_transfer_object" target="_blank">объектов передачи данных</a>. Понятно, что этот подход неэффективен и может привести к ошибкам в вашем коде.</p>
  </section>
  <h2 id="39d9"><strong>Другое</strong></h2>
  <section style="background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="b20e">Инженеры Apple также используют генерацию кода. Сопровождающие Swift создали инструмент шаблонирования на основе python под названием <a href="https://pypi.org/project/gyb/" target="_blank">GYB</a>, который является аббревиатурой от «Generate Your Boilerplate». Это может быть полезно, когда у вас есть абстракции с общей структурой. Вместо того, чтобы поддерживать несколько версий аналогичного кода, вы можете определить один шаблон и сгенерировать остальные классы/структуры/преемы.</p>
    <p id="f397">Вы можете проверить файл шаблона <a href="https://github.com/apple/swift/blob/master/stdlib/public/core/Codable.swift.gyb" target="_blank">Codable.swift.gyb</a>, чтобы получить представление о шаблонах GYB. Также есть хорошая статья о GYB и о том, как принять его в вашем проекте, размещенная в <a href="https://nshipster.com/swift-gyb/" target="_blank">NSHipster</a>.</p>
  </section>
  <h1 id="5c5d"><strong>Заключение</strong></h1>
  <section style="background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="qCnX">Генерация кода - это эффективный способ повысить вашу производительность и сделать ваше приложение более надежным. Возможно, вы знакомы с генерацией кода в iOS и уже пробовали Sourcery или Swiftgen. В противном случае я бы посоветовал начать с аксессоров ресурсов или генерации кода тестовых макетов. Таким образом, вы можете избавиться от необходимости поддерживать шаблонный код вручную и сосредоточиться на других важных вещах.</p>
  </section>
  <p id="3u4Z"></p>
  <p id="Xwtp">Спасибо за чтение!</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@codeswift/09gYeWGgUQJ</guid><link>https://teletype.in/@codeswift/09gYeWGgUQJ?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=codeswift</link><comments>https://teletype.in/@codeswift/09gYeWGgUQJ?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=codeswift#comments</comments><dc:creator>codeswift</dc:creator><title>Восхитительная интерактивная анимация</title><pubDate>Sun, 01 Aug 2021 12:56:41 GMT</pubDate><media:content medium="image" url="https://img1.teletype.in/files/00/ff/00ff4027-ac1f-4100-ab12-bbf1dcae6fa4.png"></media:content><description><![CDATA[<img src="https://img3.teletype.in/files/67/2b/672b8eb4-cfe6-441b-8d0f-4d2b5b517b72.png"></img>Анимация является неотъемлемой частью современных мобильных приложений. Они дают пользователям обратную связь об их действиях и уведомляют о том, что происходит в приложении. Кроме того, анимация придает вашему приложению более качественный внешний вид.]]></description><content:encoded><![CDATA[
  <p>Анимация является неотъемлемой частью современных мобильных приложений. Они дают пользователям обратную связь об их действиях и уведомляют о том, что происходит в приложении. Кроме того, анимация придает вашему приложению более качественный внешний вид.</p>
  <p>В этой статье я покажу, как создавать интерактивные анимации, которые очень похожи на те, которые вы видели в приложении Spotify iOS.</p>
  <figure class="m_retina">
    <img src="https://img3.teletype.in/files/67/2b/672b8eb4-cfe6-441b-8d0f-4d2b5b517b72.png" width="401" />
  </figure>
  <h1>Первоначальная настройка</h1>
  <p>Давайте начнем с создания элементов пользовательского интерфейса, которые мы хотели бы анимировать. В этой статье мы будем использовать следующие классы:</p>
  <ul>
    <li><code>PlayerViewController</code>- определяет пользовательский интерфейс игрока.</li>
    <li><code>TabBarController</code>- содержит представление панели вкладок и добавленный в дочерний элемент hasPlayerViewController.</li>
    <li>TransitionCoordinator - обрабатывает жесты пользователя и запускает анимацию для представлений PlayerViewController и TabBarController.</li>
  </ul>
  <p>Классы контроллеров представления не требуют пояснений, и TransitionCoordinator можно определить следующим образом:</p>
  <section style="background-color:hsl(hsl(323, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p><code>class TransitionCoordinator {</code></p>
    <p><code>   enum State: Equatable {</code></p>
    <p><code>   case open</code></p>
    <p><code>   case closed</code></p>
    <p><code>         static prefix func !(_ state: State) -&gt; State {</code></p>
    <p><code>         return state == .open ? .closed : .open</code></p>
    <p><code>         }</code></p>
    <p><code>}</code></p>
    <p><code>private weak var tabBarViewController: TabBarController!</code></p>
    <p><code>private weak var playerViewController: PlayerViewController!</code></p>
    <p><code>private lazy var panGestureRecognizer = createPanGestureRecognizer()</code></p>
    <p><code>private var state: State = .closed // ➊</code></p>
    <p><code>private var runningAnimators = [UIViewPropertyAnimator]() // ➋</code></p>
    <p><code>}</code></p>
  </section>
  <p>➊ Определяет состояние игрока, которое может быть открытым или закрытым.<br />➋ Коллекция запущенных аниматоров свойств. Мы добавим аниматор свойств в коллекцию, когда создадим его, и удалим, когда анимация будет завершена.</p>
  <h1>Интерактивная анимация с UIViewPropertyAnimator</h1>
  <p>Существуют различные API-интерфейсы, которые можно использовать для запуска анимации на iOS, в зависимости от желаемого уровня управления и настройки. В iOS 10 Apple представила UIViewPropertyAnimator, который предлагает больше возможностей и большую степень контроля, чем UIView.animate. Он прекрасно работает вместе с UIPanGestureRecognizer и может быть легко использован для создания интерактивной анимации.</p>
  <p>Давайте добавим обработчик распознавателем жестов панорамирования, чтобы мы могли интерактивно потянуть вид игрока вверх или вниз.</p>
  <section style="background-color:hsl(hsl(323, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p><code>@objc private func didPanPlayer(recognizer: UIPanGestureRecognizer) {</code></p>
    <p><code>switch recognizer.state {</code></p>
    <p><code>case .began:</code></p>
    <p><code>startInteractiveTransition(for: !state) // ➊</code></p>
    <p><code>case .changed:</code></p>
    <p><code>let translation = recognizer.translation(in: recognizer.view!)</code></p>
    <p><code>updateInteractiveTransition(distanceTraveled: translation.y) // ➋</code></p>
    <p><code>case .ended:</code></p>
    <p><code>let velocity = recognizer.velocity(in: recognizer.view!).y</code></p>
    <p><code>let isCancelled = isGestureCancelled(with: velocity)</code></p>
    <p><code>continueInteractiveTransition(cancel: isCancelled)</code></p>
    <p><code>case .cancelled, .failed:</code></p>
    <p><code>continueInteractiveTransition(cancel: true) // ➌</code></p>
    <p><code>default:</code></p>
    <p><code>break</code></p>
    <p><code>}</code></p>
    <p><code>}</code></p>
  </section>
  <h1>Анимация контента</h1>
  <p>Затем давайте анимируем содержание наших видов с помощью анимации слияния с затухания и затухания. Эта анимация занимает меньше времени по сравнению с кадрной анимацией. Чтобы создать этот эффект, мы выполняем анимацию ключевых кадров внутри аниматора свойств с относительным временем и продолжительностью запуска:</p>
  <section style="background-color:hsl(hsl(323, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p><code>private func fadeInPlayerAnimator(with duration: TimeInterval) -&gt; UIViewPropertyAnimator {</code></p>
    <p><code>let animator = UIViewPropertyAnimator(duration: duration, curve: .easeIn)</code></p>
    <p><code>addKeyframeAnimation(to: animator, withRelativeStartTime: 0.0, relativeDuration: 0.5) {</code></p>
    <p><code>self.updatePlayer(with: self.state)</code></p>
    <p><code>}</code></p>
    <p><code>animator.scrubsLinearly = false</code></p>
    <p><code>return animator</code></p>
    <p><code>}</code></p>
    <p><code>private func fadeOutMiniPlayerAnimator(with duration: TimeInterval) -&gt; UIViewPropertyAnimator {</code></p>
    <p><code>let animator = UIViewPropertyAnimator(duration: duration, curve: .easeOut)</code></p>
    <p><code>addKeyframeAnimation(to: animator, withRelativeStartTime: 0.0, relativeDuration: 0.5) {</code></p>
    <p><code>self.updateMiniPlayer(with: self.state)</code></p>
    <p><code>}</code></p>
    <p><code>animator.scrubsLinearly = false</code></p>
    <p><code>return animator</code></p>
    <p><code>}</code></p>
  </section>
  <figure class="m_original">
    <img src="https://img3.teletype.in/files/ad/6d/ad6d4cc2-3849-4ee1-842b-2ec11b77cf2f.gif" width="482" />
  </figure>
  <h1>Вывод</h1>
  <p>Анимация - это отличный способ уведомить пользователя о том, что происходит, и добавить отточенный внешний вид в ваше приложение. В этой статье мы узнали, как создавать интерактивную анимацию с помощью <code>UIViewPropertyAnimator</code>.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@codeswift/pAPjJgjaLIV</guid><link>https://teletype.in/@codeswift/pAPjJgjaLIV?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=codeswift</link><comments>https://teletype.in/@codeswift/pAPjJgjaLIV?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=codeswift#comments</comments><dc:creator>codeswift</dc:creator><title>Три умных расширения Swift для повышения эффективности</title><pubDate>Fri, 23 Jul 2021 09:55:15 GMT</pubDate><description><![CDATA[Swift поставляется с великолепной концепцией, называемой расширением, позволяющей нам расширять любой существующий класс, протокол или объект и добавлять новую функцию или функциональность без доступа к исходному коду. Наиболее распространенный пример этой возможности - расширение визуального визуального компонента UIKit.]]></description><content:encoded><![CDATA[
  <p>Swift поставляется с великолепной концепцией, называемой расширением, позволяющей нам расширять любой существующий класс, протокол или объект и добавлять новую функцию или функциональность без доступа к исходному коду. Наиболее распространенный пример этой возможности - расширение визуального визуального компонента UIKit.</p>
  <p>Сегодня я хочу поделиться с вами тремя идеями, которые я использую в каждом приложении для iOS, чтобы получить более чистый код.</p>
  <ol>
    <li><strong>Reduce Massive Controller Problem</strong></li>
  </ol>
  <p>Обычные UIKIT, такие как UICollectionView, UITableView, слишком сильно зависят от шаблона делегата для передачи данных, которые будут участвовать в создании проблемы в архитектуре MVC, сокращенно от Massive View Controller.</p>
  <p>Таким образом, мы можем переместить подтверждение для DataSource, Delegate of UICollectionView в отдельное расширение, чтобы очистить наш основной ViewController. Просто прокрутите страницу вниз (или создайте новый файл), введите extension [имя вашего View Controller]: ComponentToExtend. В нашем случае мы хотим расширить делегатов или наш CollectionView и переместить все функции, относящиеся к делегатам, в ваше расширение.</p>
  <section style="background-color:hsl(hsl(323, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <pre>extension ViewController : UICollectionViewDataSource , UICollectionViewDelegate , UICollectionViewDelegateFlowLayout {</pre>
    <pre>func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -&gt; Int {</pre>
    <pre>return 5</pre>
    <pre>}</pre>
    <pre>func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -&gt; UICollectionViewCell {</pre>
    <pre>let cell = collectionView.dequeueReusableCell(withReuseIdentifier: &quot;cell&quot;, for: indexPath) as! PrivateOrderCell</pre>
    <pre>cell.item = data[indexPath.row]</pre>
    <pre>return cell</pre>
    <pre>}</pre>
    <pre>func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -&gt; CGSize {</pre>
    <pre>let size = collectionView.frame</pre>
    <pre>return CGSize(width: size.width, height: 100)</pre>
    <pre>}</pre>
    <pre>func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -&gt; UIEdgeInsets {</pre>
    <pre>return UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)</pre>
    <pre>}</pre>
    <pre>func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -&gt; CGFloat {</pre>
    <pre>return 0</pre>
    <pre>}</pre>
    <pre>func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -&gt; CGFloat {</pre>
    <pre>return 10</pre>
    <pre>}</pre>
    <pre>}</pre>
  </section>
  <p><strong>2. Overloading the Constructor</strong></p>
  <p>Иногда нам нужно инициализировать экземпляр с одним или двумя значениями его свойств. Для этого мы можем создать расширение, содержащее наш инициализатор.</p>
  <section style="background-color:hsl(hsl(323, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p><code>struct Student {</code></p>
    <p><code>var name : String?</code></p>
    <p><code>var surname : String?</code></p>
    <p><code>var age : Int?</code></p>
    <p><code>var address:String?</code></p>
    <p><code>var phone :String?</code></p>
    <p><code>var mobile : String?</code></p>
    <p><code>var email : String?</code></p>
    <p><code>}</code></p>
    <p><code>extension Student {</code></p>
    <p><code>init(name : String , surname : String) {</code></p>
    <p><code>self.init(name: name, surname: surname, age: nil, address: nil, phone: nil, mobile: nil, email: nil)</code></p>
    <p><code>}</code></p>
    <p><code>}</code></p>
  </section>
  <p><strong>3.Atomic Resource</strong></p>
  <p>В процессе разработки приложения вы будете многократно использовать одну и ту же группу цветов и шрифтов. И вам может потребоваться изменить их в конце проекта. Если вы жестко запрограммировали все цвета и шрифты в своем проекте, это очень затруднило бы изменение во всем проекте. Чтобы избежать этого, мы можем создать вычисляемое свойство, выходящее за пределы UIColor.</p>
  <section style="background-color:hsl(hsl(323, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <pre>extension UIColor {</pre>
    <pre>static var mainColor : UIColor {</pre>
    <pre>return UIColor(hexString: &quot;B2924E&quot;)</pre>
    <pre>}</pre>
    <pre>static var appGray : UIColor {</pre>
    <pre>return UIColor(hexString: &quot;424244&quot;)</pre>
    <pre>}</pre>
    <pre>}</pre>
  </section>
  <p>Поэтому вместо использования собственных цветов Apple, таких как UIColor.systemBlue, теперь мы можем использовать нашу собственную цветовую палитру, написав UIColor.mainColor! Классно, правда?</p>

]]></content:encoded></item></channel></rss>