<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Ariel Bogdziewicz</title>
    <description>The latest articles on DEV Community by Ariel Bogdziewicz (@absoftware).</description>
    <link>https://dev.to/absoftware</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F463068%2F84d34324-05e4-4c38-80bd-b46d46b21ed2.png</url>
      <title>DEV Community: Ariel Bogdziewicz</title>
      <link>https://dev.to/absoftware</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/absoftware"/>
    <language>en</language>
    <item>
      <title>Git config user.email for repositories in subdirectory</title>
      <dc:creator>Ariel Bogdziewicz</dc:creator>
      <pubDate>Sat, 26 Sep 2020 00:06:28 +0000</pubDate>
      <link>https://dev.to/absoftware/git-config-user-email-for-repositories-in-subdirectory-140k</link>
      <guid>https://dev.to/absoftware/git-config-user-email-for-repositories-in-subdirectory-140k</guid>
      <description>&lt;p&gt;Quick hint for developers working on source code from different Git accounts having different e-mails for them. Let say we develop our own projects and we support development for two other companies. Our folder structure could look like&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;~/.gitconfig
~/PersonalProjects/
~/CompanyAbc/.gitconfig
~/CompanyMno/.gitconfig
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Of course we have configured default config as follows&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;user@mymac ~/ $ git config user.name "Firstname Lastname"
user@mymac ~/ $ git config user.email "user@myprivatebox.com"
user@mymac ~/ $ git config push.default simple
user@mymac ~/ $ git config core.editor emacs
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;We want different e-mails by default for all repositories in these directories without configuring this manually with command&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;user@mymac ~/CompanyAbc/website-repo (master) $ git config user.email "user@company-abc.com"
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;every time when wy clone new repository.&lt;/p&gt;

&lt;h2&gt;
  
  
  Solution
&lt;/h2&gt;

&lt;p&gt;Main &lt;code&gt;~/.gitconfig&lt;/code&gt; file should look like&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[user]
        name = Firstname Lastname
        email = user@myprivatebox.com
[push]
        default = simple
[core]
        editor = emacs
[includeIf "gitdir:~/CompanyAbc/"]
        path = ~/CompanyAbc/.gitconfig
[includeIf "gitdir:~/CompanyMno/"]
        path = ~/CompanyMno/.gitconfig
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Set custom e-mail address in &lt;code&gt;~/CompanyAbc/.gitconfig&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[user]
        email = user@company-abc.com
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;You can repeat this for other configurations like &lt;code&gt;~/CompanyMno/.gitconfig&lt;/code&gt; too.&lt;/p&gt;

&lt;h2&gt;
  
  
  Verification
&lt;/h2&gt;

&lt;p&gt;Please execute command to verify new settings&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;user@mymac ~/CompanyAbc/some-repo/ (master) $ git config user.email
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;It should throw out something like&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;user@company-abc.com
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Good luck with coding!&lt;/p&gt;

</description>
      <category>git</category>
      <category>github</category>
      <category>config</category>
      <category>email</category>
    </item>
    <item>
      <title>How to make Swift's [String: Any] decodable?</title>
      <dc:creator>Ariel Bogdziewicz</dc:creator>
      <pubDate>Tue, 08 Sep 2020 15:30:50 +0000</pubDate>
      <link>https://dev.to/absoftware/how-to-make-swift-s-string-any-decodable-5c6n</link>
      <guid>https://dev.to/absoftware/how-to-make-swift-s-string-any-decodable-5c6n</guid>
      <description>&lt;p&gt;Do you need to decode your JSON to &lt;code&gt;[String: Any]&lt;/code&gt;? Here is how you can do this.&lt;/p&gt;

&lt;h1&gt;
  
  
  Requirements
&lt;/h1&gt;

&lt;p&gt;Answer is that you cannot do this using &lt;code&gt;Any&lt;/code&gt; type. You need specify something more concrete than &lt;code&gt;Any&lt;/code&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Dictionary is automatically decodable if its elements are decodable. Type &lt;code&gt;Any&lt;/code&gt; is not decodable.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;However if you are looking for the answer it means that you actually have some kind of JSON which needs to be handled somehow. The topic is also related to array like &lt;code&gt;[Any]&lt;/code&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  Solution
&lt;/h1&gt;

&lt;p&gt;You need to specify finite number of possible values of your &lt;code&gt;Any&lt;/code&gt; type. For example we expect that there are two different structures like following:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;struct Payload: Codable {
    let id: String
    let eventName: String
    let metadata: [Metadata]
}

struct Metadata: Codable {
    let name: String?
    let price: Double?
    let rating: Int?
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;But of course you cannot do&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;let decodedData = try JSONDecoder().decode([String: Any].self, from: json.data(using: .utf8)!)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;because there is used type &lt;code&gt;Any&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;First of all we need to figure out how JSON for this dictionary possibly looks like. It would be sth like this:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
    "keyNumber1": {
        "type": "payload",
        "data": {
            "id": "someId1",
            "eventName": "Event Name 1",
            "metadata": []
        }
    },
    "keyNumber2": {
        "type": "metadata",
        "data": {
            "name": "Metadata Name",
            "price": 123.4,
            "rating": 100
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Then it's simple because you need to define &lt;code&gt;enum&lt;/code&gt; instead of your &lt;code&gt;Any&lt;/code&gt; type like follows:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;enum DataType: String, Codable {
    case payload
    case metadata
}

enum MyValue: Decodable {
    case payload(_ payload: Payload)
    case metadata(_ metadata: Metadata)

    private enum CodingKeys: String, CodingKey {
        case `type`
        case `data`
    }

    init(from decoder: Decoder) throws {
        let map = try decoder.container(keyedBy: CodingKeys.self)
        let dataType = try map.decode(DataType.self, forKey: .type)
        switch dataType {
        case .payload:
            self = .payload(try map.decode(Payload.self, forKey: .data))
        case .metadata:
            self = .metadata(try map.decode(Metadata.self, forKey: .data))
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;And decode JSON using following code:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;let decodedData = try JSONDecoder().decode([String: MyValue].self, from: json.data(using: .utf8)!)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Full Playground code:&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;



</description>
      <category>swift</category>
      <category>codable</category>
      <category>json</category>
    </item>
    <item>
      <title>Total failure of Xcode Storyboards</title>
      <dc:creator>Ariel Bogdziewicz</dc:creator>
      <pubDate>Sun, 06 Sep 2020 23:41:59 +0000</pubDate>
      <link>https://dev.to/absoftware/total-failure-of-xcode-storyboards-4hab</link>
      <guid>https://dev.to/absoftware/total-failure-of-xcode-storyboards-4hab</guid>
      <description>&lt;p&gt;There is no benefit to using Xcode Storyboards at all! Not even one! This article presents the complete list of reasons. But first, have some lemon balm or something else to calm you down before reading especially when you like this tool.&lt;/p&gt;

&lt;h1&gt;
  
  
  When did it happen? 🤦🏼‍♂️
&lt;/h1&gt;

&lt;p&gt;I couldn't write my first post about something else after long years of development an iOS applications. How could I expect that it's so terrible when iOS SDK 5.0 brought wonderful ARC (automatic reference counter) and Storyboards to improve our performance at work. Everyone started using it to be more modern and write less code 🤩 The best code is the one that doesn't exist. Sounds right?&lt;/p&gt;

&lt;h1&gt;
  
  
  No way ✋🏻
&lt;/h1&gt;

&lt;p&gt;It took more than two years to show all bad consequences of using this tool. But Storyboards became a real enemy when product owner requested changes using kind words:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Please change fonts, colors and margins in all views but only for one brand. We are going to rebrand the app.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Change what?! 🧐 😱&lt;/p&gt;

&lt;h1&gt;
  
  
  Full list of faults
&lt;/h1&gt;

&lt;p&gt;Full list of cons is long so description for each point is short and full educational explanation will be delivered in other articles of the serie &lt;a href="https://dev.to/absoftware/series/8691"&gt;Bad Xcode Storyboards&lt;/a&gt;. Points are ordered starting from the most annoying from my perspective of experience with Storyboards based on three commercial projects.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Weak reusability
&lt;/h2&gt;

&lt;p&gt;Reusability is almost non-existence without additional effort. It's related to reusability of view controllers and single views. Good architecture assumes that you can easily customise the app. That you can easily change fonts, colors, margins or add another theme for new brand just by changing a few lines of your code. It's true that you can use Storyboard references to use external view controller from another Storyboard file or set custom class for views like labels. Would you like to do it every time when creating every single label, button or switch? Base classes for all basic UI components are very helpful to easily configure your UI. However it's extremely not comfortable when using Storyboards.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Storyboards are set of hardcoded and not reusable values
&lt;/h2&gt;

&lt;p&gt;How many times did you report in code review that someone needs to use constant for hardcoded integer value? Because you know bad consequences of it. Hardcoded value has no meaning and no association with other occurrences. Guess what? All dimensions, colors, fonts are hardcoded in Storyboards and nobody cares. It's very similar to previous point but this point is related to reusability of single scalar values instead of view or view controllers. Ok, so lets change now fonts and margins in views from all our 75 view controllers implemented using Storyboards 💣&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Post-configuration in source code
&lt;/h2&gt;

&lt;p&gt;You need to write code for views anyway even when using Storyboards. Not everything is predicted to be configured using Storyboards and these files can't read your global configurations for your views. So very often it ends with post-configuration in methods like &lt;code&gt;viewDidLoad&lt;/code&gt;. Then it's hard to keep consistency of the code because some properties are set in Storyboards and others in source code. Wouldn't be it better to keep configuration of views only in one location and format?&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Broken preview
&lt;/h2&gt;

&lt;p&gt;In most cases preview shows nothing useful. You can of course use &lt;code&gt;@IBDesignable&lt;/code&gt; and &lt;code&gt;@IBInspectable&lt;/code&gt; just to maintain preview in Storyboards 😎 Why not if someone has a lot of time and power? 💪🏻 But wait, how to edit views which are located under another one or out of the bounds? Where is this transparent view?! Where are shadows, borders and rounded corners? 🤣 It's the only candidate to defend Storyboards but this failed too. Hopefully live preview introduced for SwiftUI solves this problem much better.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Storyboards fail at runtime
&lt;/h2&gt;

&lt;p&gt;Some properties are not validated in compilation time. So in case of forgotten identifiers of view controllers, cells, or other views you will get exception at runtime. It means that you can miss that and release to the end user when tests don't catch the issue. It's very sensitive for stupid mistakes like typos. So when you write code like this&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;let storyboard = UIStoryboard(name: "StorybardName", bundle: Bundle.main)
let viewController = storyboard.instantiateViewController(withIdentifier: "MyViewController") as! MyViewController
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;you use two string identifiers like &lt;code&gt;"StorybardName"&lt;/code&gt; and &lt;code&gt;"MyViewController"&lt;/code&gt; which are not validated in compilation time. It's much simpler to do just&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;let viewController = MyViewController()
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;and it's not bug prone.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Forgotten &lt;code&gt;@IBOutlet&lt;/code&gt; and &lt;code&gt;@IBAction&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;More over there are things which are not validated even in runtime like forgotten assignments for &lt;code&gt;@IBOutlet&lt;/code&gt; or &lt;code&gt;@IBAction&lt;/code&gt;. It's more related to Objective-C where you can call method or use properties on &lt;code&gt;nil&lt;/code&gt; without crash. That's why it's better to use&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@IBoutlet weak var myView: UIView!
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;instead of&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@IBOutlet weak var myView: UIView?
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;in Swift. However it's still only runtime validation. But you can do nothing to detect missing &lt;code&gt;@IBAction&lt;/code&gt; automatically. The same issue is related to forgotten class names for your custom views. All these worries take your time and bring lower quality of the end result if you don't catch your mistake yourself.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Merge conflicts
&lt;/h2&gt;

&lt;p&gt;Storyboards are unpredictable XML files. Every saving can change order of XML elements or attributes randomly without special reason. Would you like write views in your team? Assign maximum one developer per Storyboard file.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. Code reviews are almost impossible
&lt;/h2&gt;

&lt;p&gt;It's very difficult to make code review for Storyboard files. These XML-s files are based on some elements and attributes which are unkown for most of developers. More over it's extremely hard to imagine what they present when reading its content.&lt;/p&gt;

&lt;h2&gt;
  
  
  9. Storyboards are slow
&lt;/h2&gt;

&lt;p&gt;Xcode has troubles with performance when Storyboard file is opened even if there is only one view controller. It shows beach death ball very often when it freezes ⛱ I need to admit that it has been improved last time however files with source code are always faster 🚀&lt;/p&gt;

&lt;h2&gt;
  
  
  10. Storyboards are buggy
&lt;/h2&gt;

&lt;p&gt;Haven't you got troubles with strange dimensions converted from 50.0 to 49.9999? Or changed frames without your awareness? Added some strange XML elements at the end after each save? Troubles to align views correctly especially when changing device for preview? It happened to me many times.&lt;/p&gt;

&lt;h2&gt;
  
  
  11. Not friendly translations
&lt;/h2&gt;

&lt;p&gt;I hate these strange identifiers with unreadable format for humans like&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/* Class = "UILabel"; text = "English text in Storyboard"; ObjectID = "LSm-a6-m9b"; */
"LSm-a6-m9b.text" = "Polish translation";
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;It would be much simpler to keep all translations in common file &lt;code&gt;Localizable.strings&lt;/code&gt; to make them reusable for all views like&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"English text" = "Polish translation";
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;and use in source code function like&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;func localizedString(_ text: String) -&amp;gt; String {
    return NSLocalizedString(string, comment: "")
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;to gain access to translations. More over it would be even possible to introduce validation in compilation time introducing &lt;code&gt;enum&lt;/code&gt; for translations to have full control over translations in our project that we could not miss any translation.&lt;/p&gt;

&lt;h2&gt;
  
  
  12. Hard debugging of constraints
&lt;/h2&gt;

&lt;p&gt;Sorry but this tree of constraints is almost not manageable. Better is when you select one particular view to see its constraints. However editing of properties for constraints means mouse acrobatics on the desk and it's hard to make easy overview of settings. And what about forgotten &lt;code&gt;@IBOutlet&lt;/code&gt; for constraint? That's the pain of lost day 🤕&lt;/p&gt;

&lt;h2&gt;
  
  
  13. Segues paradox
&lt;/h2&gt;

&lt;p&gt;That's difficult part to explain. However existence of segues suggest that we should make Storyboards as big as possible that our story could be complete, that you could see all associations between view controllers visually in this very big and beautiful Storyboard.&lt;/p&gt;

&lt;p&gt;On the other hand we know what are consequences of using very big Storyboards. They are difficult to maintain and editor slowdowns proportionally to the number of view controllers in your story. Developers very often decide to keep Storyboards with only a few view controllers or even only one using partially segues and partially using transitions between view controllers in source code. It makes your project inconsistent.&lt;/p&gt;

&lt;p&gt;So purpose of Segues seems to be irrational.&lt;/p&gt;

&lt;h2&gt;
  
  
  14. Mouse clicking
&lt;/h2&gt;

&lt;p&gt;Day with Storyboards serves you terrible pain in your hand because of mouse clicking. Bloodshot eyes from straining to look for another text field or checkbox. Have I really set constraint to safe area? Or was it margin? Lets check again... Oh no, which tab of properties should I switch to again?  Jumping between Storyboard and source code is also fun. But hey, I'm not wasting time for writing difficult source code.&lt;/p&gt;

&lt;h2&gt;
  
  
  15. Context switching
&lt;/h2&gt;

&lt;p&gt;Storyboards serve you not only pain in hands or eyes. Your brain may explode 🤯 because of switching between source code and Storyboards having content with different kind of presentation and nature. So brain needs to switch from source code mode to tracking visual components of Storyboards and vice versa when going back. And you need to remember what you actually was doing in previous context. Context switching takes time and makes you exhausted 😵&lt;/p&gt;

&lt;h2&gt;
  
  
  16. Extremely difficult refactoring
&lt;/h2&gt;

&lt;p&gt;Haven't you tried to reorganise view hierarchy of your Storyboard's view controllers? It better to delete all and build it from scratch when changes are more revolutionary. Otherwise you will lost yourself in the middle of your work.&lt;/p&gt;

&lt;h2&gt;
  
  
  17. Storyboards require additional maintaining
&lt;/h2&gt;

&lt;p&gt;Storyboards don't make job for you. If you don't want to write source code then you must click this with mouse. But Storyboards are one additional more layer which brings bugs you can't fix, new therms like segues or &lt;code&gt;@IBOutlet/@IBAction&lt;/code&gt; you need to know and remember about. And even more you can spend extra time implementing and testing &lt;code&gt;@IBDesignable/@IBInspectable&lt;/code&gt; or custom segues. So you need to deal with these things but they wouldn't be needed if you were not using Storyboards. So it's extra layer of worry.&lt;/p&gt;

&lt;h1&gt;
  
  
  There is some good about Storyboards
&lt;/h1&gt;

&lt;p&gt;No, there is not!&lt;/p&gt;

&lt;h1&gt;
  
  
  Final result
&lt;/h1&gt;

&lt;p&gt;&lt;em&gt;Programmatic views&lt;/em&gt; &lt;strong&gt;17&lt;/strong&gt; : &lt;strong&gt;0&lt;/strong&gt; &lt;em&gt;Xcode Storyboards&lt;/em&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Horrible Storyboards
&lt;/h1&gt;

&lt;p&gt;I've found similar article &lt;a href="https://gist.github.com/iraycd/01b45c5e1be7ef6957b7"&gt;Horrible Storyboards&lt;/a&gt;. It mentions about another issues which I haven't experienced yet like:&lt;/p&gt;

&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Storyboards don't let you change the type of special view controllers&lt;/li&gt;
&lt;li&gt;Storyboards add two extra liabilities to your project&lt;/li&gt;
&lt;li&gt;Storyboards don't allow you to add a subview to a &lt;code&gt;UIImageView&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Storyboards don't allow you to enable Auto Layout for individual View(-Controller)s&lt;/li&gt;
&lt;li&gt;Storyboards have a higher risk of breaking backwards compatibility&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;h1&gt;
  
  
  What are alternatives?
&lt;/h1&gt;

&lt;p&gt;It appears that writing views programmatically is not easy too. Apple didn't provide easy in use classes and methods to write views easily. At least notation could be shorter however concept of constraints itself is quite good in UIKit. That's why people invented a lot of DSL (domain-specific language) libraries like the most popular &lt;a href="https://github.com/SnapKit/SnapKit"&gt;SnapKit&lt;/a&gt;, tricky &lt;a href="https://github.com/robb/Cartography"&gt;Carthography&lt;/a&gt; or super concise &lt;a href="https://github.com/freshOS/Stevia"&gt;Stevia&lt;/a&gt;. I invented my own DSL AutoLayout library &lt;a href="https://github.com/abswift/layout-extension"&gt;LayoutExtension&lt;/a&gt; which is now in early version however I use it in one commercial project with full success.&lt;/p&gt;

</description>
      <category>ios</category>
      <category>xcode</category>
      <category>storyboards</category>
    </item>
  </channel>
</rss>
