{"id":35973,"date":"2022-05-24T15:04:48","date_gmt":"2022-05-24T19:04:48","guid":{"rendered":"https:\/\/mjtsai.com\/blog\/?p=35973"},"modified":"2022-06-06T11:13:46","modified_gmt":"2022-06-06T15:13:46","slug":"swiftui-in-2022","status":"publish","type":"post","link":"https:\/\/mjtsai.com\/blog\/2022\/05\/24\/swiftui-in-2022\/","title":{"rendered":"SwiftUI in 2022"},"content":{"rendered":"<p><a href=\"https:\/\/twitter.com\/Naxum\/status\/1456061292402204678\">Jake Sawyer<\/a>:<\/p>\n<blockquote cite=\"https:\/\/twitter.com\/Naxum\/status\/1456061292402204678\">\n<p>Even if you already know a bit (or a lot) of SwiftUI, <a href=\"https:\/\/cs193p.sites.stanford.edu\">Stanford&rsquo;s course<\/a> is incredible, amazing, wonderful, AND FREE!<\/p>\n<\/blockquote>\n\n<p><a href=\"https:\/\/twitter.com\/nicklockwood\/status\/1466813486416240647\">Nick Lockwood<\/a>:<\/p>\n<blockquote cite=\"https:\/\/twitter.com\/nicklockwood\/status\/1466813486416240647\"><p>Half the iOS devs on my TL keep posting stuff like &ldquo;here&rsquo;s how I shipped an amazing full-featured cross-platform SwiftUI app in 10 minutes and the other half are like &ldquo;Button presses have been broken in SwiftUI for 16 months and Apple hasn&rsquo;t responded to my radar&rdquo;<\/p><\/blockquote>\n\n<p><a href=\"https:\/\/twitter.com\/agiletortoise\/status\/1468970329808666633\">Greg Pierce<\/a>:<\/p>\n<blockquote cite=\"https:\/\/twitter.com\/agiletortoise\/status\/1468970329808666633\">\n<p>My SwiftUI development process starts with a clear definition of the problem and ends in a recursive loop of Google searches trying to figure out why the thing I did to fix A broke B, and the thing I did to fix B, broke C, etc.<\/p>\n<\/blockquote>\n\n<p><a href=\"https:\/\/www.dabblingbadger.com\/blog\/2020\/11\/5\/dismissing-the-keyboard-in-swiftui\">Jonathan Badger<\/a>:<\/p>\n<blockquote cite=\"https:\/\/www.dabblingbadger.com\/blog\/2020\/11\/5\/dismissing-the-keyboard-in-swiftui\"><p>As a newbie to the framework, I enjoy the instant feedback that the canvas preview provides with each code modification and am thoroughly impressed by the elegance and simplicity of SwiftUI&rsquo;s design.  That being said, I have run into odd behaviors and challenging problems that make me want to tear my hair out at times.  One such issue, which at first seems trivial, is how to dismiss the keyboard when a user taps an area on the screen that is outside the bounds of a <a href=\"https:\/\/developer.apple.com\/documentation\/swiftui\/textfield\">TextField<\/a> or <a href=\"https:\/\/developer.apple.com\/documentation\/swiftui\/texteditor\">TextEditor<\/a> view.  Here, I will discuss a few of the common issues surrounding keyboard dismissal and provide two solutions and workarounds that I have found after an embarrassing amount of googling and combing of <a href=\"https:\/\/stackoverflow.com\">StackOverflow<\/a><\/p><\/blockquote>\n\n<p><a href=\"https:\/\/twitter.com\/ChristianSelig\/status\/1471286155157069827\">Christian Selig<\/a>:<\/p>\n<blockquote cite=\"https:\/\/twitter.com\/ChristianSelig\/status\/1471286155157069827\">\n<p>Has anyone done a nice blog post on integrating SwiftUI as parts of an existing UIKit app and having them communicate nicely? (Many posts are all or nothing) Integrating it for bits and pieces sounds fun, but a bit intimidating. &#x1F62C;<\/p>\n<\/blockquote>\n\n<p><a href=\"https:\/\/twitter.com\/sanguish\/status\/1471288411290021893\">Scott Anguish<\/a>:<\/p>\n<blockquote cite=\"https:\/\/twitter.com\/sanguish\/status\/1471288411290021893\">\n<p>It&rsquo;s a nightmare. That&rsquo;s what we found.<\/p>\n<\/blockquote>\n\n<p><a href=\"https:\/\/twitter.com\/stroughtonsmith\/status\/1471375259513282564\">Steve Troughton-Smith<\/a>:<\/p>\n<blockquote cite=\"https:\/\/twitter.com\/stroughtonsmith\/status\/1471375259513282564\">\n<p>SwiftUI remains incompetent at basic layout, something Playgrounds users are going to find out the hard way&#8230; &#x1F605;<\/p>\n<\/blockquote>\n\n<p><a href=\"https:\/\/twitter.com\/RonAvitzur\/status\/1471685654434045952\">Ron Avitzur<\/a>:<\/p>\n<blockquote cite=\"https:\/\/twitter.com\/RonAvitzur\/status\/1471685654434045952\">\n<p>I&rsquo;m stuck diagnosing an infinite loop in SwiftUI layout for code that worked on macOS 11.<\/p>\n<\/blockquote>\n\n<p><a href=\"https:\/\/twitter.com\/stroughtonsmith\/status\/1471905823341359114\">Steve Troughton-Smith<\/a>:<\/p>\n<blockquote cite=\"https:\/\/twitter.com\/stroughtonsmith\/status\/1471905823341359114\">\n<p>I&rsquo;m <em>really<\/em> excited about using SwiftUI in my apps.<\/p>\n<p>SwiftUI is an unreliable mess that needs to be treated with oven mitts, and I won&rsquo;t be <em>increasing<\/em> my reliance on it anytime soon.<\/p>\n<p>That dichotomy is what makes the SwiftUI story so frustrating.<\/p>\n<\/blockquote>\n\n<p><a href=\"https:\/\/twitter.com\/oskargroth\/status\/1471820726772678660\">Oskar Groth<\/a>:<\/p>\n<blockquote cite=\"https:\/\/twitter.com\/oskargroth\/status\/1471820726772678660\">\n<p>We&rsquo;re halfway into SwiftUI 3 and this is yet another example where it fails to provide us with a properly working default control.<\/p>\n<\/blockquote>\n\n<p><a href=\"https:\/\/twitter.com\/RonAvitzur\/status\/1472259552439508996\">Ron Avitzur<\/a>:<\/p>\n<blockquote cite=\"https:\/\/twitter.com\/RonAvitzur\/status\/1472259552439508996\">\n<p>Today in C++ &#x2192; Swift: macOS 12 SwiftUI Focus<\/p>\n<p><code>.focused($focus, equals: .mathBlock(id))<\/code>  is not setting the first responder to my <code>NSViewRepresentable<\/code> NSView.<\/p>\n<p>Should I expect it to?<\/p>\n<p>Anyone have insight into how AppKit first responder interacts with Swift Focus for custom views?<\/p>\n<\/blockquote>\n\n<p><a href=\"https:\/\/twitter.com\/adamkaump\/status\/1473381003154632707\">Adam Kaump<\/a>:<\/p>\n<blockquote cite=\"https:\/\/twitter.com\/adamkaump\/status\/1473381003154632707\">\n<p>&ldquo;Hey I got 90% of what I wanted really quick! Neat!&rdquo;\n&ldquo;&#8230;oh turns out that last 10% is basically impossible, eh?&rdquo;<\/p>\n<\/blockquote>\n\n<p><a href=\"https:\/\/twitter.com\/marcoarment\/status\/1473386393443446790\">Marco Arment<\/a>:<\/p>\n<blockquote cite=\"https:\/\/twitter.com\/marcoarment\/status\/1473386393443446790\">\n<p>I like a lot of it. But it&rsquo;s not simple, easy, or mature.<\/p>\n<p>Its conceptual elegance and clean presentation-slide code are quickly ruined by common real-world needs.<\/p>\n<p>And you frequently slam HARD into walls that you just can&rsquo;t overcome.<\/p>\n<\/blockquote>\n\n<p><a href=\"https:\/\/twitter.com\/stroughtonsmith\/status\/1480039605378465792\">Steve Troughton-Smith<\/a>:<\/p>\n<blockquote cite=\"https:\/\/twitter.com\/stroughtonsmith\/status\/1480039605378465792\">\n<p>I really do feel like every time I use SwiftUI, even in the simplest of places, it&rsquo;s burying mines in my code that will be set off at some point in the future<\/p>\n<p>[&#8230;]<\/p>\n<p>Conundrum: do I spend the hours required to try different combinations of SwiftUI modifiers to hopefully find a fix for this layout issue, with potential of it breaking again in the future, or do I spend same hours porting to UIKit knowing I&rsquo;ll likely never have to touch it again<\/p>\n<\/blockquote>\n\n<p><a href=\"https:\/\/twitter.com\/simonbs\/status\/1481038719188672515\">Simon B. St&oslash;vring<\/a>:<\/p>\n<blockquote cite=\"https:\/\/twitter.com\/simonbs\/status\/1481038719188672515\">\n<p>I wouldn&rsquo;t use SwiftUI for core parts of a complex app yet but it&rsquo;s safe to say that Runestone wouldn&rsquo;t have so many settings if it wasn&rsquo;t for SwiftUI. It&rsquo;s so simple to build settings screens that look decent with SwiftUI.<\/p>\n<\/blockquote>\n\n<p><a href=\"https:\/\/twitter.com\/joshavant\/status\/1481067320994938880\">Josh Avant<\/a>:<\/p>\n<blockquote cite=\"https:\/\/twitter.com\/joshavant\/status\/1481067320994938880\">\n<p>Today, 2.5 years after release, there&rsquo;s still validly a more-than-small amount of opinion that SwiftUI is not even Production Ready for mature, complex applications.<\/p>\n<p>If you have to make the choice today, I say choose UIKit.<\/p>\n<p>(Unless your app isn&rsquo;t intended to be mature, complex)<\/p>\n<\/blockquote>\n\n<p><a href=\"https:\/\/twitter.com\/helje5\/status\/1483211769359261697\">Helge He&szlig;<\/a>:<\/p>\n<blockquote cite=\"https:\/\/twitter.com\/helje5\/status\/1483211769359261697\">\n<p>There is very much to like about SwiftUI (and almost all my recent apps use it), but e.g. that it can&rsquo;t do a very core and basic thing like navigation in its 3rd iteration properly is just embarrassing. &#x1F937;&#x200D;&#x2640;&#xFE0F;<\/p>\n<\/blockquote>\n\n<p><a href=\"https:\/\/twitter.com\/helje5\/status\/1483238845420294146\">Helge He&szlig;<\/a>:<\/p>\n<blockquote cite=\"https:\/\/twitter.com\/helje5\/status\/1483238845420294146\">\n<p>The real difference is that one may have been missing API you&rsquo;d want (not really), while SwiftUI has API all over but the provided stuff isn&rsquo;t just bad but simply doesn&rsquo;t work. Often even depending on context - i.e. it is an inconsistent mess from an API perspective.<\/p>\n<\/blockquote>\n\n<p><a href=\"https:\/\/twitter.com\/samdeane\/status\/1484144142150217732\">Sam Deane<\/a>:<\/p>\n<blockquote cite=\"https:\/\/twitter.com\/samdeane\/status\/1484144142150217732\">\n<p>SwiftUI lists can get really slow, due to all the clever diffing that goes on for animation.<\/p>\n<p>There is <a href=\"https:\/\/www.hackingwithswift.com\/articles\/210\/how-to-fix-slow-list-updates-in-swiftui\">a workaround<\/a>, but it seems that it stops working if you put the list inside a <code>NavigationView<\/code>.<\/p>\n<\/blockquote>\n<p>Let&rsquo;s use value types instead of objects and then allocate a UUID for each one since they no longer have pointer identity.<\/p>\n\n<p><a href=\"https:\/\/twitter.com\/tapbot_paul\/status\/1485707873434939398\">Paul Haddad<\/a>:<\/p>\n<blockquote cite=\"https:\/\/twitter.com\/tapbot_paul\/status\/1485707873434939398\">\n<p>It&rsquo;s still terrible, takes at least twice as long to do anything for results that IMO are not as good as UIKit.<\/p>\n<\/blockquote>\n\n<p><a href=\"https:\/\/twitter.com\/dinhvh\/status\/1489663022624743428\">Ho&agrave; V. DINH<\/a>:<\/p>\n<blockquote cite=\"https:\/\/twitter.com\/dinhvh\/status\/1489663022624743428\"><p>I&rsquo;m going to rewrite an app that I wrote with SwiftUI back to regular Swift + UIKit because I&rsquo;m hitting so many blockers when refining the details.<\/p><\/blockquote>\n\n<p><a href=\"https:\/\/twitter.com\/icanzilb\/status\/1490045181105745937\">Marin Todorov<\/a>:<\/p>\n<blockquote cite=\"https:\/\/twitter.com\/icanzilb\/status\/1490045181105745937\"><p>&#x1F4AF; internet points for \n@steipete\n for making a landing page for this SwiftUI crasher that you didn&rsquo;t cause and can&rsquo;t fix &#x1F44C;&#x1F3FC;\n<\/p><\/blockquote>\n\n<p><a href=\"https:\/\/twitter.com\/rustyshelf\/status\/1490561446362873857\">Russell Ivanovic<\/a>:<\/p>\n<blockquote cite=\"https:\/\/twitter.com\/rustyshelf\/status\/1490561446362873857\">\n<p>Let&rsquo;s play a little game called &ldquo;Will the SwiftUI preview load?&rdquo;. It&rsquo;s ok if you&rsquo;re not an Apple Developer, you can play along!<\/p>\n<\/blockquote>\n\n<p><a href=\"https:\/\/twitter.com\/marcoarment\/status\/1491048767000399872\">Marco Arment<\/a>:<\/p>\n<blockquote cite=\"https:\/\/twitter.com\/marcoarment\/status\/1491048767000399872\">\n<p>A day building in SwiftUI:<\/p>\n<p>I would like a search bar in the navigation bar like every app<\/p>\n<p>Oh that requires iOS 15<\/p>\n<p>I would like it to activate when presented<\/p>\n<p>Can&rsquo;t do that without rebuilding with UIKit hacks<\/p>\n<p>I would like it not to hide itself<\/p>\n<p>Can&rsquo;t do that, go back to UIKit<\/p>\n<p>For every hour SwiftUI&rsquo;s niceness has saved me, I&rsquo;ve probably lost two more hours to the slow and buggy tooling, scouring the web to make up for its non-discoverability and poor documentation, hacking around its brick-wall limitations, or giving up and rewriting things in UIKit.<\/p>\n<\/blockquote>\n\n<p><a href=\"https:\/\/twitter.com\/phillipcaudell\/status\/1491712806986600455\">Phillip Caudell<\/a>:<\/p>\n<blockquote cite=\"https:\/\/twitter.com\/phillipcaudell\/status\/1491712806986600455\">\n<p>Writing SwiftUI is like riding a bicycle downhill on a beautiful sunny day.<\/p>\n<p>Until the bike suddenly explodes, killing you.<\/p>\n<p>It makes building a production app in SwiftUI extremely difficult when the basic system controls don&rsquo;t work.<\/p>\n<p>There&rsquo;s so much to love about SwiftUI, but still after several years the basics are still buggy as hell.<\/p>\n<\/blockquote>\n\n<p><a href=\"https:\/\/twitter.com\/kocienda\/status\/1491815698674249734\">Ken Kocienda<\/a>:<\/p>\n<blockquote cite=\"https:\/\/twitter.com\/kocienda\/status\/1491815698674249734\">\n<p>A tool like SwiftUI which can&rsquo;t easily handle simple and well-understood tasks isn&rsquo;t likely to scale to more complex and experimental tasks without seemingly endless frustration.<\/p>\n<\/blockquote>\n\n<p><a href=\"https:\/\/twitter.com\/stroughtonsmith\/status\/1491816643122679808\">Steve Troughton-Smith<\/a>:<\/p>\n<blockquote cite=\"https:\/\/twitter.com\/stroughtonsmith\/status\/1491816643122679808\">\n<p>Abstracting developers from the &lsquo;real&rsquo; goings-on is also a means of control on Apple&rsquo;s part, to shrink us down into a little sandbox we can&rsquo;t break out of. Can&rsquo;t compete with system apps if we only have toy APIs<\/p>\n<\/blockquote>\n\n<p><a href=\"https:\/\/twitter.com\/elkmovie\/status\/1491817428929683462\">Michael Love<\/a>:<\/p>\n<blockquote cite=\"https:\/\/twitter.com\/elkmovie\/status\/1491817428929683462\">\n<p>Seems like an especially self-destructive policy on Apple&rsquo;s part in this case, because it&rsquo;s not clear they have much of a vision for what to actually do with AR apps and by abstracting us away they&rsquo;re going to make it impossible for developers to help come up with one.<\/p>\n<\/blockquote>\n\n<p><a href=\"https:\/\/twitter.com\/RonAvitzur\/status\/1491871709607051283\">Ron Avitzur<\/a>:<\/p>\n<blockquote cite=\"https:\/\/twitter.com\/RonAvitzur\/status\/1491871709607051283\">\n<p>Today in AppKit &#x2192; SwiftUI:<\/p>\n<p><code>.keyboardShortcut(.upArrow)<\/code> does not work with <code>.buttonStyle(PlainButtonStyle())<\/code><\/p>\n<p>but <code>.leftArrow<\/code> and <code>.rightArrow<\/code> do work<\/p>\n<p><code>.upArrow<\/code> works with <code>.buttonStyle(BorderlessButtonStyle())<\/code>.<\/p>\n<p>Filed under: I do not even want to know the explanation behind this.<\/p>\n<\/blockquote>\n\n<p><a href=\"https:\/\/twitter.com\/Freerunnering\/status\/1492001501979553798\">Kyle Howells<\/a>:<\/p>\n<blockquote cite=\"https:\/\/twitter.com\/Freerunnering\/status\/1492001501979553798\">\n<p>I can&rsquo;t help feeling SwiftUI was a massive mistake for Apple.<\/p>\n<p>I keep seeing blog posts and articles of people trying to write native iOS or macOS apps, using SwiftUI, abandoning it as: too buggy\/much work\/effort\/not worth it.\nAnd then switching to Electron &amp; React Native.<\/p>\n<p>If Apple had just spent its effort on updating UIKit, adding more standard UI components modern apps use\/need.<\/p>\n<p>Improving Xcode&rsquo;s tooling, bug fixes. They&rsquo;d have 1 really nice \"reliable\" toolset for people to use.<\/p>\n<\/blockquote>\n\n<p><a href=\"https:\/\/twitter.com\/Freerunnering\/status\/1492656382952235008\">Kyle Howells<\/a>:<\/p>\n<blockquote cite=\"https:\/\/twitter.com\/Freerunnering\/status\/1492656382952235008\">\n<p>This is my main issue with SwiftUI. It&rsquo;s a high level black box.<\/p>\n<p>With UIKit I can: drop down to <code>UIControl<\/code> easily if I want to replace <code>UIButton<\/code>; make my own table view, drop down to <code>CALayer<\/code>&rsquo;s, customise the <code>CALayer<\/code> a view uses, etc....<\/p>\n<\/blockquote>\n\n<p><a href=\"https:\/\/twitter.com\/Freerunnering\/status\/1492673029607985152\">Kyle Howells<\/a>:<\/p>\n<blockquote cite=\"https:\/\/twitter.com\/Freerunnering\/status\/1492673029607985152\"><p>And there in lies the problem of why I can never see SwiftUI is a real\/full replacement for any UI framework.<\/p>\n<p>Either it needs to allow you full control to build the thing.<\/p>\n<p>Or it needs to be a high level abstraction over top the real thing.<\/p>\n<p>Currently it&rsquo;s sort of both badly.<\/p><\/blockquote>\n\n<p><a href=\"https:\/\/twitter.com\/RonAvitzur\/status\/1492729491155685376\">Ron Avitzur<\/a>:<\/p>\n<blockquote cite=\"https:\/\/twitter.com\/RonAvitzur\/status\/1492729491155685376\">\n<p><code>@FocusedValue<\/code> as seen in macOS menus is not changing reliably when switching windows despite my best attempts. However, setting a global in response to <code>NSWindow.didBecomeKeyNotification<\/code> seems to work just fine.<\/p>\n<\/blockquote>\n\n<p><a href=\"https:\/\/twitter.com\/jtaby\/status\/1493997898538749954\">Majd Taby<\/a>:<\/p>\n<blockquote cite=\"https:\/\/twitter.com\/jtaby\/status\/1493997898538749954\">\n<p>We WERE going to include a SwiftUI component in our next update, but alas, I just rewrote it in UIKit.<\/p>\n<p>This was a result of three situations:<\/p>\n<p>1. Incomplete APIs in SwiftUI limiting our capabilities<\/p>\n<p>2. Coordinating the SwiftUI layout updates with UIKit ones was difficult and caused animation problems<\/p>\n<p>3. Our data model wasn&rsquo;t designed for SwiftUI, and thus caused a lot of CPU thrash<\/p>\n<\/blockquote>\n\n<p><a href=\"https:\/\/twitter.com\/jsngr\/status\/1495061809694449664\">Jordan Singer<\/a>:<\/p>\n<blockquote cite=\"https:\/\/twitter.com\/jsngr\/status\/1495061809694449664\">\n<p>Learning SwiftUI unleashed creativity inside of me like no language ever has and brought joy back to building user interfaces.<\/p>\n<p>Here&rsquo;s a thread of my experiments to show you what&rsquo;s possible, to learn from, and code to remix&#x1F447;<\/p>\n<\/blockquote>\n\n<p><a href=\"https:\/\/twitter.com\/ronyfadel\/status\/1496540785487003648\">Rony Fadel<\/a>:<\/p>\n<blockquote cite=\"https:\/\/twitter.com\/ronyfadel\/status\/1496540785487003648\">\n<p>SwiftUI forces you to think more deeply about architecture compared to UIKit.<\/p>\n<p>Abstraction hijackings (e.g. getting a reference to and conditional casting a parent or sibling vc) are not possible by virtue of how SwiftUI works.<\/p>\n<\/blockquote>\n\n<p><a href=\"https:\/\/developer.apple.com\/forums\/thread\/685797\">Ron Avitzur<\/a> (<a href=\"https:\/\/twitter.com\/RonAvitzur\/status\/1497597262792314883\">tweet<\/a>):<\/p>\n<blockquote cite=\"https:\/\/developer.apple.com\/forums\/thread\/685797\">\n<p>Is it possible to set the <code>isAlternate<\/code> property on an <code>NSMenuItem<\/code> in the macOS menubar to implement dynamic menu items in a SwiftUI document-based app which uses <code>CommandMenu<\/code> to construct the menus?<\/p>\n<\/blockquote>\n\n<p><a href=\"https:\/\/twitter.com\/stroughtonsmith\/status\/1502033870904045568\">Steve Troughton-Smith<\/a>:<\/p>\n<blockquote cite=\"https:\/\/twitter.com\/stroughtonsmith\/status\/1502033870904045568\">\n<p>The harsh reality of SwiftUI in 2022 is that it doesn&rsquo;t enable a competent dev to build a better app. It gives you a lesser-than-native, less-reliable, less-compatible, less debuggable app &mdash; a two-tier system where 3rd-parties may never be able to compete with Apple&rsquo;s own<\/p>\n<p>Short of major advancement at WWDC22 wrt to reliability, configurability &amp; back-compat, I&rsquo;m not sure SwiftUI will ever be the right technology for my apps. Its priorities are clearly elsewhere, and that&rsquo;s OK. But that isn&rsquo;t the future of anything, just a lower entry point<\/p>\n<\/blockquote>\n\n<p><a href=\"https:\/\/twitter.com\/ronyfadel\/status\/1502066373505212418\">Rony Fadel<\/a>:<\/p>\n<blockquote cite=\"https:\/\/twitter.com\/ronyfadel\/status\/1502066373505212418\"><p>SwiftUI + Introspect gets us that much&#x1F44C; closer, but I agree that we&rsquo;re not there yet.\nRight now SwiftUI is a reactive shell on top UIKit with a number of gaping holes (Lists, Navigation, View presentation etc..)<\/p><\/blockquote>\n\n<p><a href=\"https:\/\/twitter.com\/rustyshelf\/status\/1502113392513138688\">Russell Ivanovic<\/a>:<\/p>\n<blockquote cite=\"https:\/\/twitter.com\/rustyshelf\/status\/1502113392513138688\">\n<p>As long as you&rsquo;re ok with ignoring Autolayout errors. I get tonnes of those in my SwiftUI views and it&rsquo;s like &ldquo;what would you like me to do with that info&#8230;exactly?&rdquo;<\/p>\n<\/blockquote>\n\n<p><a href=\"https:\/\/twitter.com\/DamienPetrilli\/status\/1505500932175446017\">Damien Petrilli<\/a>:<\/p>\n<blockquote cite=\"https:\/\/twitter.com\/DamienPetrilli\/status\/1505500932175446017\">\n<p>The Joy of SwiftUI:<\/p>\n<p>Animation in simulator:&#x2705;<br \/>\nAnimation in Swift Playgrounds on iPad:&#x2705;<br \/>\nAnimation in the App: freeze and lag.<\/p>\n<p>100% same code.<\/p>\n<\/blockquote>\n\n<p><a href=\"https:\/\/twitter.com\/onmyway133\/status\/1510194193616015362\">Khoa Pham<\/a>:<\/p>\n<blockquote cite=\"https:\/\/twitter.com\/onmyway133\/status\/1510194193616015362\">\n<p>Just finished refactoring a 115+ screens #SwiftUI app to UIKit navigation.  Every screen has its own UIViewController and is self-contained.<\/p>\n<p>Feels so good<\/p>\n<p>As long as SwiftUI is still based on UIKit, using UIKit is a safer bet.<\/p>\n<\/blockquote>\n\n<p><a href=\"https:\/\/twitter.com\/RonAvitzur\/status\/1510704004338135041\">Ron Avitzur<\/a>:<\/p>\n<blockquote cite=\"https:\/\/twitter.com\/RonAvitzur\/status\/1510704004338135041\">\n<p>Looks like it is back to UIKit for the <code>UIPanGestureRecognizer<\/code> for me.<\/p>\n<\/blockquote>\n\n<p><a href=\"https:\/\/twitter.com\/simonbs\/status\/1512414399453184007\">Simon B. St&oslash;vring<\/a>:<\/p>\n<blockquote cite=\"https:\/\/twitter.com\/simonbs\/status\/1512414399453184007\">\n<p>Many seem to either like SwiftUI or believe that it&rsquo;ll get better down the road and be the future of UI development on iOS and iPadOS.<\/p>\n<p>Is there a possibility that SwiftUI is simply a bad idea for these platforms? That it won&rsquo;t work?<\/p>\n<p>I&rsquo;m starting to fear that as we&rsquo;re adopting SwiftUI in our apps, we&rsquo;re also compromising too much. Our UIs are getting simpler but more buggy. We&rsquo;re becoming slobby.<\/p>\n<p>Maybe it&rsquo;ll all work out in the end. I hope it will. But this is a fear that I currently have.<\/p>\n<\/blockquote>\n\n<p><a href=\"https:\/\/twitter.com\/stroughtonsmith\/status\/1512998310990127110\">Steve Troughton-Smith<\/a>:<\/p>\n<blockquote cite=\"https:\/\/twitter.com\/stroughtonsmith\/status\/1512998310990127110\">\n<p>To my surprise (not.), yet another SwiftUI regression has begun to screw with my apps, this time affecting tab-focus and text fields. Appears to have cropped up either in the latest SDK or most recent macOS release. Worked fine when I shipped (&amp; for 2 years), now does not.<\/p>\n<p>I think once I bail on SwiftUI that&rsquo;ll be it for me for quite a while. I&rsquo;ll check back in in 5, 8 years, like I did with Swift, and maybe it&rsquo;ll be tolerable then. I have a lot of development in me before then, and I just can&rsquo;t base any of it around SwiftUI<\/p>\n<p>Unlike early Swift, which was just clumsy to write but could still make a 1:1 version of your ObjC app, early SwiftUI is radioactive and eats holes in everything it touches. I feel like Apple will be paying this one off for a veery long time<\/p><\/blockquote>\n\n<p><a href=\"https:\/\/twitter.com\/stroughtonsmith\/status\/1513023555365134339\">Steve Troughton-Smith<\/a>:<\/p>\n<blockquote cite=\"https:\/\/twitter.com\/stroughtonsmith\/status\/1513023555365134339\">\n<p>One place I <em>can<\/em> recommend SwiftUI: as a preview wrapper for UIKit views &amp; view controllers. This element is hugely useful even to developers who don&rsquo;t use SwiftUI for any of their code<\/p>\n<\/blockquote>\n\n<p><a href=\"https:\/\/twitter.com\/KyleHughes\/status\/1513601035410935814\">Kyle Hughes<\/a>:<\/p>\n<blockquote cite=\"https:\/\/twitter.com\/KyleHughes\/status\/1513601035410935814\">\n<p>In March I removed the last traces of SwiftUI from an app, going back to 100% UIKit. I needed block element support in attributed strings.<\/p>\n<p>In March I also released a 100% SwiftUI app.<\/p>\n<p>Perhaps they are both good.<\/p>\n<\/blockquote>\n\n<p><a href=\"https:\/\/twitter.com\/chriseidhof\/status\/1514118840015372291\">Chris Eidhof<\/a>:<\/p>\n<blockquote cite=\"https:\/\/twitter.com\/chriseidhof\/status\/1514118840015372291\">\n<p>I was trying to create an <code>NSImage<\/code> out of a simple SwiftUI <code>View<\/code>. Turns out to be surprisingly difficult: <code>dataWithPDF<\/code> is completely broken, <code>cacheDisplay(in:to:)<\/code> has strange artifacts and good old <code>CGWindowListCreateImage<\/code> works as expected.<\/p>\n<\/blockquote>\n\n<p><a href=\"https:\/\/twitter.com\/RonAvitzur\/status\/1514349787960647681\">Ron Avitzur<\/a>:<\/p>\n<blockquote cite=\"https:\/\/twitter.com\/RonAvitzur\/status\/1514349787960647681\">\n<p>Today&rsquo;s API eldritch horror experience trying to implement the macOS Paste menu item so that it is enabled or disabled appropriately depending on what is on the clipboard.<\/p>\n<p>In AppKit, this is very easy.<\/p>\n<p>In SwiftUI, I&rsquo;m lost in a maze of twisty APIs...<\/p>\n<\/blockquote>\n\n<p><a href=\"https:\/\/twitter.com\/kuba_suder\/status\/1523655175688589312\">Kuba Suder<\/a>:<\/p>\n<blockquote cite=\"https:\/\/twitter.com\/kuba_suder\/status\/1523655175688589312\"><p>This talk is a bit of a mindfuck&#8230; I&rsquo;m gonna have to watch it more than once. Is it just me, or is it&#8230; kinda unintuitive that the lifecycle of state variables in that subview depends on whether you write this as if\/else or with ternary operator &ldquo;?:&rdquo; ?<\/p><\/blockquote>\n\n<p><a href=\"https:\/\/twitter.com\/krzyzanowskim\/status\/1522995884979482625\">Marcin Krzyzanowski<\/a>:<\/p>\n<blockquote cite=\"https:\/\/twitter.com\/krzyzanowskim\/status\/1522995884979482625\">\n<p>overpromise under-deliver in one screen. the title itself is almost an oxymoron<\/p>\n<\/blockquote>\n\n<p><a href=\"https:\/\/stevenpcurtis.medium.com\/swiftui-still-isnt-production-ready-39c6ee60f391\">\nSteven Curtis<\/a>:<\/p>\n<blockquote cite=\"https:\/\/stevenpcurtis.medium.com\/swiftui-still-isnt-production-ready-39c6ee60f391\"><p>Imagine using a version of Xcode with a <a href=\"https:\/\/developer.apple.com\/forums\/thread\/691415?page=4\">major memory leak<\/a> attached to SwiftUI. If it&rsquo;s Xcode 13 I think that&rsquo;s fine, they&rsquo;ll fix in in 13.1. What do you mean, they only fixed it in Xcode 13.2.1?<\/p><p>[&#8230;]<\/p><p>I want to decouple navigation from views. I don&rsquo;t want to use <code>UIHostingController<\/code> as I would like to create a completely native SwiftUI App. I need to have easy access to views using deep-linking where the screens depend on complex state, and can be accessed from multiple parts of the App.<\/p><\/blockquote>\n\n<p><a href=\"https:\/\/twitter.com\/jamesthomson\/status\/1526552860690993154\">James Thomson<\/a>:<\/p>\n<blockquote cite=\"https:\/\/twitter.com\/jamesthomson\/status\/1526552860690993154\">\n<p>Since installing 12.4, all the labels for my SwiftUI pickers have vanished. Affects my existing versions too. This is a Mac-idiom Catalyst app.<\/p>\n<p>That&rsquo;s really not great &#x1F641;<\/p>\n<\/blockquote>\n\n<p><a href=\"https:\/\/twitter.com\/RonAvitzur\/status\/1528112744574033920\">Ron Avitzur<\/a>:<\/p>\n<blockquote cite=\"https:\/\/twitter.com\/RonAvitzur\/status\/1528112744574033920\">\n<p>Replacing a SwiftUI ScrollView\/VStack with a List View was straightforward and provides swipe-to-delete, and drag-to-reorder rows. However, it also made scrolling the view impossible. Breakpoint on scrollTo does not fire. I fail to understand this.<\/p>\n<\/blockquote>\n\n<p><a href=\"https:\/\/twitter.com\/PaolaNotPaolo\/status\/1528638970778816512\">Paola Mata<\/a>:<\/p>\n<blockquote cite=\"https:\/\/twitter.com\/PaolaNotPaolo\/status\/1528638970778816512\">\n<p>All these hacks and workarounds for making SwiftUI do basic shit&#8230;<\/p>\n<\/blockquote>\n\n<p>See also: <a href=\"https:\/\/www.swiftbysundell.com\/podcast\/116\/\">The evolution of SwiftUI<\/a>.<\/p>\n\n<p>Previously:<\/p>\n<ul>\n<li><a href=\"https:\/\/mjtsai.com\/blog\/2022\/05\/23\/how-to-open-a-window-in-swiftui\/\">How to Open a Window in SwiftUI<\/a><\/li>\n<li><a href=\"https:\/\/mjtsai.com\/blog\/2022\/04\/19\/swiftui-performance-tips\/\">SwiftUI Performance Tips<\/a><\/li>\n<li><a href=\"https:\/\/mjtsai.com\/blog\/2022\/03\/29\/lifetime-of-state-properties-in-swiftui\/\">Lifetime of State Properties in SwiftUI<\/a><\/li>\n<li><a href=\"https:\/\/mjtsai.com\/blog\/2022\/02\/10\/micro-blog-moving-ios-app-to-react-native\/\">Micro.blog Moving iOS App to React Native<\/a><\/li>\n<li><a href=\"https:\/\/mjtsai.com\/blog\/2021\/12\/21\/how-to-find-why-a-swiftui-view-is-updating\/\">How to Find Why a SwiftUI View Is Updating<\/a><\/li>\n<li><a href=\"https:\/\/mjtsai.com\/blog\/2021\/09\/06\/the-persistent-gravity-of-cross-platform\/\">The Persistent Gravity of Cross Platform<\/a><\/li>\n<li><a href=\"https:\/\/mjtsai.com\/blog\/2021\/08\/11\/1password-8-for-mac-early-access\/\">1Password 8 for Mac Early Access<\/a><\/li>\n<li><a href=\"https:\/\/mjtsai.com\/blog\/2021\/07\/19\/swiftui-examples-for-macos\/\">SwiftUI Examples for macOS<\/a><\/li>\n<li><a href=\"https:\/\/mjtsai.com\/blog\/2021\/06\/08\/shortcuts-for-mac\/\">Shortcuts for Mac<\/a><\/li>\n<li><a href=\"https:\/\/mjtsai.com\/blog\/2021\/02\/26\/apple-documentation-and-swiftui-for-mac\/\">Apple Documentation and SwiftUI for Mac<\/a><\/li>\n<li><a href=\"https:\/\/mjtsai.com\/blog\/2020\/12\/24\/swiftui-layout-explained\/\">SwiftUI Layout Explained<\/a><\/li>\n<li><a href=\"https:\/\/mjtsai.com\/blog\/2020\/11\/30\/what-is-not-so-great-about-swiftui\/\">What Is Not So Great About SwiftUI<\/a><\/li>\n<li><a href=\"https:\/\/mjtsai.com\/blog\/2020\/09\/18\/the-state-of-swiftui\/\">The State of SwiftUI<\/a><\/li>\n<li><a href=\"https:\/\/mjtsai.com\/blog\/2020\/08\/06\/emulating-equal-size-constraints-in-swiftui\/\">Emulating Equal-Size Constraints in SwiftUI<\/a><\/li>\n<\/ul>\n\n<p id=\"swiftui-in-2022-update-2022-05-25\">Update (2022-05-25): <a href=\"https:\/\/twitter.com\/SteveStreza\/status\/1529189751063859205\">Steve Streza<\/a>:<\/p>\n<blockquote cite=\"https:\/\/twitter.com\/SteveStreza\/status\/1529189751063859205\">\n<p>SwiftUI will be great once it&rsquo;s production ready. Maybe that will be this year. Until that happens though, this post remains a spectacular cautionary tale of what happens when you go down that road.<\/p>\n<\/blockquote>\n\n<p><a href=\"https:\/\/twitter.com\/pilky\/status\/1529217321398673408\">Martin Pilkington<\/a>:<\/p>\n<blockquote cite=\"https:\/\/twitter.com\/pilky\/status\/1529217321398673408\">\n<p>There is a very strong argument to make that declarative UI frameworks are always going to be a case of &ldquo;faster to get to good, difficult to get to great&rdquo;<\/p>\n<p>Building great software requires fine-grained control over the UI, but that&rsquo;s kind of the antithesis of declarative UI.<\/p>\n<p>That isn&rsquo;t to say you can&rsquo;t have parts of UI be built declaratively, just that you can&rsquo;t handle every case people will have with a full declarative framework<\/p>\n<\/blockquote>\n\n<p><a href=\"https:\/\/twitter.com\/radiantav\/status\/1529248785116893184\">Aleksandar Vaci&#x107;<\/a>:<\/p>\n<blockquote cite=\"https:\/\/twitter.com\/radiantav\/status\/1529248785116893184\">\n<p>I expected such issues back in 2019 (the talk I gave at Pragmaconf) but did not see them taking this long to clear up.<\/p>\n<p>The black box design and complete dependence on Apple to fix issues did not turn out good.<\/p>\n<\/blockquote>\n\n<p><a href=\"https:\/\/twitter.com\/mluisbrown\/status\/1529412686978629634\">Michael Brown<\/a>:<\/p>\n<blockquote cite=\"https:\/\/twitter.com\/mluisbrown\/status\/1529412686978629634\">\n<p>This absolutely does <em>not<\/em> reflect my experience of using SwiftUI. In the 8 months that I&rsquo;ve been using it intensively the time it has saved me is immeasurable compared to the problems encountered. \nIt is unquestionably better than using UIKit (which I have used since 2010).<\/p>\n<\/blockquote>\n\n<p><a href=\"https:\/\/twitter.com\/matthewfx\/status\/1529419703374184448\">matfx<\/a>:<\/p>\n<blockquote cite=\"https:\/\/twitter.com\/matthewfx\/status\/1529419703374184448\">\n<p>I have built a production app for a bank in SwiftUI (released in March 2021) but I can relate to all of things described.<\/p>\n<\/blockquote>\n\n<p><a href=\"https:\/\/twitter.com\/terhechte\/status\/1529422786665467904\">Benedikt Terhechte<\/a>:<\/p>\n<blockquote cite=\"https:\/\/twitter.com\/terhechte\/status\/1529422786665467904\">\n<p>Doesn&rsquo;t even mention how invalid layouts crash SwiftUI apps at runtime!<\/p>\n<\/blockquote>\n\n<p><a href=\"https:\/\/twitter.com\/vinibaggio\/status\/1529427265968300035\">vinibaggio<\/a>:<\/p>\n<blockquote cite=\"https:\/\/twitter.com\/vinibaggio\/status\/1529427265968300035\">\n<p>SwiftUI is such a bummer. While I agree with the feelings that it makes UI development so fun and freeing, when you start running into issues, then the magic is shattered and you&rsquo;re back to the harsh reality that computers are all broken.<\/p>\n<\/blockquote>\n\n<p><a href=\"https:\/\/twitter.com\/samdeane\/status\/1529433920491737091\">Sam Deane<\/a>:<\/p>\n<blockquote cite=\"https:\/\/twitter.com\/samdeane\/status\/1529433920491737091\">\n<p>I do still like SwiftUI a lot, and am using it in production apps.<\/p>\n<p>I ended up making <a href=\"https:\/\/github.com\/elegantchaos\/FastList\">this<\/a> to fix the List issues. It is crude but effective and does just enough of what I need.<\/p>\n<p>I do still regularly hit brick walls, but a lot of the time I find them to reflect a strongly opinionated design philosophy, rather than just an accidental omission.<\/p>\n<p>In other words, someone is deliberately preventing you from doing something they don&rsquo;t think you should do.<\/p>\n<\/blockquote>\n\n<p><a href=\"https:\/\/twitter.com\/mark_volkmann\/status\/1529494317873647617\">R. Mark Volkmann<\/a>:<\/p>\n<blockquote cite=\"https:\/\/twitter.com\/mark_volkmann\/status\/1529494317873647617\">\n<p>I have never used UIKit and am a relatively new user of SwiftUI. So far I love it.<\/p>\n<\/blockquote>\n\n<p><a href=\"https:\/\/twitter.com\/stroughtonsmith\/status\/1529438357834633216\">Steve Troughton-Smith<\/a>:<\/p>\n<blockquote cite=\"https:\/\/twitter.com\/stroughtonsmith\/status\/1529438357834633216\">\n<p>After @jamesthomson&rsquo;s tweet, it was with trepidation I upgraded to macOS 12.4 to see how the changes to SwiftUI have broken my own apps. Sure enough, all the labels have been removed from my pickers, in the shipping version of Pastel.<\/p>\n<\/blockquote>\n\n<p>See also: <a href=\"https:\/\/news.ycombinator.com\/item?id=31504354\">Hacker News<\/a>.<\/p>\n\n<p><a href=\"https:\/\/daringfireball.net\/linked\/2022\/05\/25\/swiftui-may-2022\">John Gruber<\/a> (<a href=\"https:\/\/twitter.com\/daringfireball\/status\/1529587368331980801\">tweet<\/a>):<\/p>\n<blockquote cite=\"https:\/\/daringfireball.net\/linked\/2022\/05\/25\/swiftui-may-2022\">\n<p>I&rsquo;d like to see leaps-and-bounds improvements announced this year.<\/p>\n<\/blockquote>\n\n<p id=\"swiftui-in-2022-update-2022-05-26\">Update (2022-05-26): <a href=\"https:\/\/twitter.com\/lucvandal\/status\/1529652411345817601\">Luc Vandal<\/a>:<\/p>\n<blockquote cite=\"https:\/\/twitter.com\/lucvandal\/status\/1529652411345817601\">\n<p>Overall, my experience with SwiftUI has been mostly positive. Of course there were times I wanted it to die in a  but I was able to develop &amp; release an app that is on the App Store &amp; actually selling.<\/p>\n<\/blockquote>\n\n<p><a href=\"https:\/\/twitter.com\/KevinBHayes\/status\/1529657787885801473\">Kevin Hayes<\/a>:<\/p>\n<blockquote cite=\"https:\/\/twitter.com\/KevinBHayes\/status\/1529657787885801473\">\n<p>I&rsquo;m not blind to its bugs and limitations but it&rsquo;s definitely a net positive for me. It&rsquo;s working out well in 1Password 8 for iOS, and my side projects are SwiftUI too.<\/p>\n<\/blockquote>\n\n<p><a href=\"https:\/\/news.ycombinator.com\/item?id=31505201\">Francisco Tolmasky<\/a>:<\/p>\n<blockquote cite=\"https:\/\/news.ycombinator.com\/item?id=31505201\"><p>It requires being an expert in it before you can predict its limitations (which often are bug-related and not necessarily &ldquo;conceptual&rdquo;). This would maybe be excusable for a beta release, but SwiftUI is now around 4 years old.<\/p><p>Arguably, its original sin is simply not being open source, and on top of that is trapped behind one of the most opaque bug-reporting mechanisms in the industry. Every minor hack involves tremendous reverse-engineering, which may then have to be replicated throughout the community, instead of being a GitHub issue and PR request like in Electron for example. There are of course upsides to the closed-source model, but in 2022, you have to <em>deliver<\/em> on those upsides if you want to make a strong case for your framework.<\/p><\/blockquote>\n\n<p><a href=\"https:\/\/martiancraft.com\/blog\/2022\/05\/swiftui-quickstart\/\">Richard Turton<\/a>:<\/p>\n<blockquote cite=\"https:\/\/martiancraft.com\/blog\/2022\/05\/swiftui-quickstart\/\">\n<p>If you are working with an existing UIKit codebase and are SwiftUI-curious when it comes to adding or updating new features, this article should help answer your questions. I&rsquo;m going to cover some of the technical details of how SwiftUI works and how state is managed, some tips on integrating SwiftUI into your existing code, and some common pain points.<\/p>\n<\/blockquote>\n\n<p id=\"swiftui-in-2022-update-2022-05-31\">Update (2022-05-31): <a href=\"https:\/\/twitter.com\/malhal\/status\/1529961944727408640\">Malcolm Hall<\/a>:<\/p>\n<blockquote cite=\"https:\/\/twitter.com\/malhal\/status\/1529961944727408640\"><p>Beginners think it&rsquo;s not ready yet; experts know it will never work. Take for example MapKit, completely different delegation model vs UIKit. The SwiftUI wrapper is fundamentally broken and will never work perfectly until MapKit is fixed but that breaks existing apps =  deadlock.<\/p>\n<p>Another example is NSTableView \/ NSTableViewDelegate, cannot work with SwiftUI&rsquo;s diffing model with over 100 rows, grinds to a halt. Which team is going to fix that?<\/p><\/blockquote>\n\n<p id=\"swiftui-in-2022-update-2022-06-06\">Update (2022-06-06): See also: <a href=\"https:\/\/swiftui-is-fine.tumblr.com\/\">SwiftUI Is Fine<\/a>.<\/p>","protected":false},"excerpt":{"rendered":"<p>Jake Sawyer: Even if you already know a bit (or a lot) of SwiftUI, Stanford&rsquo;s course is incredible, amazing, wonderful, AND FREE! Nick Lockwood: Half the iOS devs on my TL keep posting stuff like &ldquo;here&rsquo;s how I shipped an amazing full-featured cross-platform SwiftUI app in 10 minutes and the other half are like &ldquo;Button [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"apple_news_api_created_at":"2022-05-24T19:04:54Z","apple_news_api_id":"d72e4be3-3c9a-452e-bd44-54c6dd587393","apple_news_api_modified_at":"2022-06-06T15:13:52Z","apple_news_api_revision":"AAAAAAAAAAAAAAAAAAAACw==","apple_news_api_share_url":"https:\/\/apple.news\/A1y5L4zyaRS69RFTG3Vhzkw","apple_news_coverimage":0,"apple_news_coverimage_caption":"","apple_news_is_hidden":false,"apple_news_is_paid":false,"apple_news_is_preview":false,"apple_news_is_sponsored":false,"apple_news_maturity_rating":"","apple_news_metadata":"\"\"","apple_news_pullquote":"","apple_news_pullquote_position":"","apple_news_slug":"","apple_news_sections":"\"\"","apple_news_suppress_video_url":false,"apple_news_use_image_component":false,"footnotes":""},"categories":[4],"tags":[31,2078,30,2077,71,901,1812,1227],"class_list":["post-35973","post","type-post","status-publish","format-standard","hentry","category-programming-category","tag-ios","tag-ios-15","tag-mac","tag-macos-12","tag-programming","tag-swift-programming-language","tag-swiftui","tag-top-posts"],"apple_news_notices":[],"_links":{"self":[{"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/posts\/35973","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/comments?post=35973"}],"version-history":[{"count":13,"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/posts\/35973\/revisions"}],"predecessor-version":[{"id":36075,"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/posts\/35973\/revisions\/36075"}],"wp:attachment":[{"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/media?parent=35973"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/categories?post=35973"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/tags?post=35973"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}