{"id":670,"date":"2023-04-29T00:19:08","date_gmt":"2023-04-28T22:19:08","guid":{"rendered":"https:\/\/mic.st\/blog\/?p=670"},"modified":"2023-04-29T09:41:57","modified_gmt":"2023-04-29T07:41:57","slug":"how-to-use-chatgpt-for-swift-ios-development","status":"publish","type":"post","link":"https:\/\/mic.st\/blog\/how-to-use-chatgpt-for-swift-ios-development\/","title":{"rendered":"Using ChatGPT for Swift iOS development"},"content":{"rendered":"\n<p>Lately, I also jumped onto the ChatGPT train and wanted to give it a try for the use in Swift development for the iOS platform. Here are my experiences so far using it for around 1 or two months now.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">How to get access without sharing your (real) phone number<\/h2>\n\n\n\n<p>It&#8217;s still free and pretty much unlimited as far as I know. I never ran into any server overload issues etc. You can just go to <a href=\"http:\/\/chat.openai.com\/\" target=\"_blank\" rel=\"noopener\">chat.openai.com<\/a> register and start using it. The interface is pretty self-explanatory and straightforward.<\/p>\n\n\n\n<p>What kept me back the most all this time was not my disinterest but that you are forced to give them a real phone number. Which is still the case and it really sucks. Nobody knows what it&#8217;s used for or who has access. It&#8217;s a little shady.<\/p>\n\n\n\n<p><strong>Don&#8217;t spend any time on searching and trying these free online SMS receiver services. Non of them is working for registering for ChatGPT. I tried a lot of these for some hours. Just don&#8217;t do it.<\/strong><\/p>\n\n\n\n<p>A better time investment when you do not want to share your real number is to just get a prepaid SIM (here in Germany you can get them for around 5\u20ac) and put them in any cellphone.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">My use case in short<\/h2>\n\n\n\n<p>I finally decided to order that burner SIM card and try it out, because I had a pretty clear use case in my mind. What I wanted to do was generating default plant care data for a gardening app I am working on as a side project.<\/p>\n\n\n\n<p>My idea was to give the user based on any plant&#8217;s genus some plant care data that works out for most species of that genus. If you are asking yourself what is &#8220;genus&#8221; or &#8220;species&#8221;: In biology, this is used to classify any organism. E.g. for a well known typ of plant: &#8220;Monstera&#8221; is the genus and &#8220;deliciosa&#8221; is the species. There are other super- and subclasses in taxonomy but they do not matter for now. <\/p>\n\n\n\n<p><em>If you are more interested on that topic, here is a short PDF by the University of Nebraska-Lincoln: <a href=\"https:\/\/alec.unl.edu\/documents\/cde\/2017\/natural-resources\/classification-and-naming-of-plants.pdf\" target=\"_blank\" rel=\"noopener\">https:\/\/alec.unl.edu\/documents\/cde\/2017\/natural-resources\/classification-and-naming-of-plants.pdf<\/a><\/em><\/p>\n\n\n\n<p>OK, so my plan was:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Get a list of most common indoor houseplants<\/li>\n\n\n\n<li>Somehow populate a dictionary or something I can copy out of the chat window that contains all the data I need.<\/li>\n<\/ol>\n\n\n\n<p>I will continue explaining how I tackled this plan in more detail in a minute.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">It&#8217;s all about the prompts<\/h2>\n\n\n\n<p>Obviously, whether or not ChatGPT returns something useful is based on your prompts. It&#8217;s the only way you can interact with it. This means, similar to how your Google results are determined by how skillful you are in using Google, you can also help or mislead ChatGPT with your questions (That&#8217;s already a small spoiler regarding whether or not I am convinced that ChatGPT alone will replace Swift iOS development or my job as a developer).<\/p>\n\n\n\n<p>Yes, handling ChatGPT might be way easier for a lot of people compared to doing proper Google searches. This is because it accepts natural language. Google instead works best with good keywords and you still have to scroll through the results.<\/p>\n\n\n\n<p>What is fundamentally different, is that ChatGPT often gives you one answer that might or might not work. Google often leads you to some StackOverflow thread instead where you get some more context via comments. Often enough the code ChatGPT offers you does not even compile. From what I experienced, it&#8217;s often not syntactically incorrect but types might be handled wrong, deprecated APIs are used etc.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Designing your prompts<\/h2>\n\n\n\n<p>Similar to how you would tackle any problem in software development, you also need to do that when talking to ChatGPT. Think of ChatGPT like an iOS colleague with whom you are doing kind of pair programming, willingly helping your Swift development in whatever way.<\/p>\n\n\n\n<p>This means we need to give ChatGPT some more constraints to return something useful. E.g. just start with defining a data structure you would like to use.<\/p>\n\n\n\n<pre class=\"wp-block-verse\">I need a struct representing plant care data with three properties: plantGenus, watering, humidity and lightRequirements <\/pre>\n\n\n\n<p>It will result in something that works out but is probably not what you really wanted:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"Swift\" data-shcb-language-slug=\"swift\"><span><code class=\"hljs language-swift\"><span class=\"hljs-class\"><span class=\"hljs-keyword\">struct<\/span> <span class=\"hljs-title\">PlantCareData<\/span> <\/span>{\n    <span class=\"hljs-keyword\">let<\/span> plantGenus: <span class=\"hljs-type\">String<\/span>\n    <span class=\"hljs-keyword\">let<\/span> watering: <span class=\"hljs-type\">String<\/span>\n    <span class=\"hljs-keyword\">let<\/span> humidity: <span class=\"hljs-type\">String<\/span>\n    <span class=\"hljs-keyword\">let<\/span> lightRequirements: <span class=\"hljs-type\">String<\/span>\n    \n    <span class=\"hljs-keyword\">init<\/span>(plantGenus: <span class=\"hljs-type\">String<\/span>, watering: <span class=\"hljs-type\">String<\/span>, humidity: <span class=\"hljs-type\">String<\/span>, lightRequirements: <span class=\"hljs-type\">String<\/span>) {\n        <span class=\"hljs-keyword\">self<\/span>.plantGenus = plantGenus\n        <span class=\"hljs-keyword\">self<\/span>.watering = watering\n        <span class=\"hljs-keyword\">self<\/span>.humidity = humidity\n        <span class=\"hljs-keyword\">self<\/span>.lightRequirements = lightRequirements\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Swift<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">swift<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>As you can see, all of the properties are <code>Strings<\/code> which is not really great if you think about doing some analytics on these values, creating a UI with icons for each level, etc. What we want is something like an <code>enum<\/code> maybe with different levels.<\/p>\n\n\n\n<p>With the following prompt I was already hooked. I gave it this quite rudimentary prompt:<\/p>\n\n\n\n<pre class=\"wp-block-verse\">Please change the type of watering to an enum that represents the amount of dryness needed before watering, e.g. \u201clet fully dry\u201d. Use four cases that seem to make sense\n<\/pre>\n\n\n\n<p>As you can see, I only gave it only an example of one case but it came up with something pretty useful:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"Swift\" data-shcb-language-slug=\"swift\"><span><code class=\"hljs language-swift\"><span class=\"hljs-class\"><span class=\"hljs-keyword\">struct<\/span> <span class=\"hljs-title\">PlantCareData<\/span> <\/span>{\n    <span class=\"hljs-keyword\">let<\/span> plantGenus: <span class=\"hljs-type\">String<\/span>\n    <span class=\"hljs-keyword\">let<\/span> watering: <span class=\"hljs-type\">WateringDryness<\/span>\n    <span class=\"hljs-keyword\">let<\/span> humidity: <span class=\"hljs-type\">String<\/span>\n    <span class=\"hljs-keyword\">let<\/span> lightRequirements: <span class=\"hljs-type\">String<\/span>\n    \n    <span class=\"hljs-keyword\">init<\/span>(plantGenus: <span class=\"hljs-type\">String<\/span>, watering: <span class=\"hljs-type\">WateringDryness<\/span>, humidity: <span class=\"hljs-type\">String<\/span>, lightRequirements: <span class=\"hljs-type\">String<\/span>) {\n        <span class=\"hljs-keyword\">self<\/span>.plantGenus = plantGenus\n        <span class=\"hljs-keyword\">self<\/span>.watering = watering\n        <span class=\"hljs-keyword\">self<\/span>.humidity = humidity\n        <span class=\"hljs-keyword\">self<\/span>.lightRequirements = lightRequirements\n    }\n}\n\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">enum<\/span> <span class=\"hljs-title\">WateringDryness<\/span>: <span class=\"hljs-title\">String<\/span> <\/span>{\n    <span class=\"hljs-keyword\">case<\/span> letFullyDry = <span class=\"hljs-string\">\"Let fully dry\"<\/span>\n    <span class=\"hljs-keyword\">case<\/span> letPartiallyDry = <span class=\"hljs-string\">\"Let partially dry\"<\/span>\n    <span class=\"hljs-keyword\">case<\/span> letMoist = <span class=\"hljs-string\">\"Keep moist\"<\/span>\n    <span class=\"hljs-keyword\">case<\/span> waterFrequently = <span class=\"hljs-string\">\"Water frequently\"<\/span>\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Swift<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">swift<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>This is pretty awesome already I&#8217;d say. Typing the prompts here was way easier than thinking about the cases let alone typing everything of this. However, we are not finished yet.<\/p>\n\n\n\n<p>Of course the same works for the other properties as well:<\/p>\n\n\n\n<pre class=\"wp-block-verse\">Do something similar with humidity. Use an enum for that property that has six different cases with most common humidities for houseplants.<\/pre>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"Swift\" data-shcb-language-slug=\"swift\"><span><code class=\"hljs language-swift\"><span class=\"hljs-comment\">\/\/ Left out all the previous code here<\/span>\n\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">enum<\/span> <span class=\"hljs-title\">HumidityLevel<\/span>: <span class=\"hljs-title\">String<\/span> <\/span>{\n    <span class=\"hljs-keyword\">case<\/span> low = <span class=\"hljs-string\">\"Low humidity\"<\/span>\n    <span class=\"hljs-keyword\">case<\/span> moderateLow = <span class=\"hljs-string\">\"Moderate low humidity\"<\/span>\n    <span class=\"hljs-keyword\">case<\/span> moderate = <span class=\"hljs-string\">\"Moderate humidity\"<\/span>\n    <span class=\"hljs-keyword\">case<\/span> moderateHigh = <span class=\"hljs-string\">\"Moderate high humidity\"<\/span>\n    <span class=\"hljs-keyword\">case<\/span> high = <span class=\"hljs-string\">\"High humidity\"<\/span>\n    <span class=\"hljs-keyword\">case<\/span> veryHigh = <span class=\"hljs-string\">\"Very high humidity\"<\/span>\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Swift<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">swift<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>What I really liked was how you can fine-tune the results. I wanted to have some less ambiguous data, i.e. I asked it to add some numbers:<\/p>\n\n\n\n<pre class=\"wp-block-verse\">Please add some percentages of humidity to these levels for more details what is meant by the descriptions.<\/pre>\n\n\n\n<p>And the result looks pretty convincing again!<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">enum HumidityLevel: <span class=\"hljs-built_in\">String<\/span> {\n    <span class=\"hljs-keyword\">case<\/span> low = <span class=\"hljs-string\">\"Low humidity (less than 30%)\"<\/span>\n    <span class=\"hljs-keyword\">case<\/span> moderateLow = <span class=\"hljs-string\">\"Moderate low humidity (30-40%)\"<\/span>\n    <span class=\"hljs-keyword\">case<\/span> moderate = <span class=\"hljs-string\">\"Moderate humidity (40-50%)\"<\/span>\n    <span class=\"hljs-keyword\">case<\/span> moderateHigh = <span class=\"hljs-string\">\"Moderate high humidity (50-60%)\"<\/span>\n    <span class=\"hljs-keyword\">case<\/span> high = <span class=\"hljs-string\">\"High humidity (60-70%)\"<\/span>\n    <span class=\"hljs-keyword\">case<\/span> veryHigh = <span class=\"hljs-string\">\"Very high humidity (more than 70%)\"<\/span>\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Lastly, I wanted to get some more usefule type for the <code>lightRequirements<\/code> property:<\/p>\n\n\n\n<pre class=\"wp-block-verse\">Please help me with the lightRequirements as well. This enum should have four different cases with different levels of light that do make sense for houseplants.<\/pre>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"Swift\" data-shcb-language-slug=\"swift\"><span><code class=\"hljs language-swift\"><span class=\"hljs-class\"><span class=\"hljs-keyword\">enum<\/span> <span class=\"hljs-title\">LightIntensity<\/span>: <span class=\"hljs-title\">String<\/span> <\/span>{\n    <span class=\"hljs-keyword\">case<\/span> lowLight = <span class=\"hljs-string\">\"Low light\"<\/span>\n    <span class=\"hljs-keyword\">case<\/span> mediumLight = <span class=\"hljs-string\">\"Medium light\"<\/span>\n    <span class=\"hljs-keyword\">case<\/span> brightIndirectLight = <span class=\"hljs-string\">\"Bright indirect light\"<\/span>\n    <span class=\"hljs-keyword\">case<\/span> directSunlight = <span class=\"hljs-string\">\"Direct sunlight\"<\/span>\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Swift<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">swift<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Again, pretty convincing \ud83d\ude42 We learned so far: ChatGPT can create nice Swift enums. Don&#8217;t get me wrong, I do not want to undervalue this, it&#8217;s pretty useful already! <\/p>\n\n\n\n<p>But now lets get serious!<\/p>\n\n\n\n<pre class=\"wp-block-verse\">Now, please create some data based on that struct for me.\nPlease create an array of type PlantCareData based on the 10 most common houseplants.<\/pre>\n\n\n\n<p>Let&#8217;s highlight again the simplicity of this: You can ask it to reference anything you created together before (&#8220;based on that struct&#8221;, &#8220;array of type PlantCareData&#8221;) and enrich it with some very blurry requests (&#8220;the 10 most common houseplants&#8221;).<\/p>\n\n\n\n<p>It does not ask for any further clarification, it&#8217;s first idea already looks awesome! There are still errors but let me show you the result first:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"Swift\" data-shcb-language-slug=\"swift\"><span><code class=\"hljs language-swift\"><span class=\"hljs-comment\">\/\/ Define the PlantCareData objects<\/span>\n<span class=\"hljs-keyword\">let<\/span> plant1 = <span class=\"hljs-type\">PlantCareData<\/span>(plantGenus: <span class=\"hljs-string\">\"Monstera deliciosa\"<\/span>,\n                           watering: .letSoilDry,\n                           humidity: .moderate,\n                           lightRequirements: .mediumLight)\n\n<span class=\"hljs-keyword\">let<\/span> plant2 = <span class=\"hljs-type\">PlantCareData<\/span>(plantGenus: <span class=\"hljs-string\">\"Pothos\"<\/span>,\n                           watering: .keepMoist,\n                           humidity: .moderateLow,\n                           lightRequirements: .lowLight)\n\n<span class=\"hljs-keyword\">let<\/span> plant3 = <span class=\"hljs-type\">PlantCareData<\/span>(plantGenus: <span class=\"hljs-string\">\"Snake plant\"<\/span>,\n                           watering: .letSoilDry,\n                           humidity: .low,\n                           lightRequirements: .lowLight)\n\n<span class=\"hljs-keyword\">let<\/span> plant4 = <span class=\"hljs-type\">PlantCareData<\/span>(plantGenus: <span class=\"hljs-string\">\"ZZ plant\"<\/span>,\n                           watering: .letSoilDry,\n                           humidity: .low,\n                           lightRequirements: .lowLight)\n\n<span class=\"hljs-keyword\">let<\/span> plant5 = <span class=\"hljs-type\">PlantCareData<\/span>(plantGenus: <span class=\"hljs-string\">\"Spider plant\"<\/span>,\n                           watering: .keepMoist,\n                           humidity: .moderate,\n                           lightRequirements: .mediumLight)\n\n<span class=\"hljs-keyword\">let<\/span> plant6 = <span class=\"hljs-type\">PlantCareData<\/span>(plantGenus: <span class=\"hljs-string\">\"Peace lily\"<\/span>,\n                           watering: .keepMoist,\n                           humidity: .high,\n                           lightRequirements: .mediumLight)\n\n<span class=\"hljs-keyword\">let<\/span> plant7 = <span class=\"hljs-type\">PlantCareData<\/span>(plantGenus: <span class=\"hljs-string\">\"Dracaena\"<\/span>,\n                           watering: .keepMoist,\n                           humidity: .moderate,\n                           lightRequirements: .mediumLight)\n\n<span class=\"hljs-keyword\">let<\/span> plant8 = <span class=\"hljs-type\">PlantCareData<\/span>(plantGenus: <span class=\"hljs-string\">\"Aloe vera\"<\/span>,\n                           watering: .letSoilDry,\n                           humidity: .low,\n                           lightRequirements: .brightIndirectLight)\n\n<span class=\"hljs-keyword\">let<\/span> plant9 = <span class=\"hljs-type\">PlantCareData<\/span>(plantGenus: <span class=\"hljs-string\">\"Rubber plant\"<\/span>,\n                           watering: .letSoilDry,\n                           humidity: .moderate,\n                           lightRequirements: .mediumLight)\n\n<span class=\"hljs-keyword\">let<\/span> plant10 = <span class=\"hljs-type\">PlantCareData<\/span>(plantGenus: <span class=\"hljs-string\">\"Fiddle leaf fig\"<\/span>,\n                            watering: .letSoilDry,\n                            humidity: .moderate,\n                            lightRequirements: .brightIndirectLight)\n\n<span class=\"hljs-comment\">\/\/ Create an array of PlantCareData objects<\/span>\n<span class=\"hljs-keyword\">let<\/span> houseplants: &#91;<span class=\"hljs-type\">PlantCareData<\/span>] = &#91;plant1, plant2, plant3, plant4, plant5, plant6, plant7, plant8, plant9, plant10]\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Swift<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">swift<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>This is awesome right!? Let&#8217;s recap what happened:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>It found ten most common houseplants<\/li>\n\n\n\n<li>It found data about watering, humidity and light requirements for each of these plants<\/li>\n\n\n\n<li>It somehow mapped this data to the enums you created earlier!<\/li>\n<\/ol>\n\n\n\n<p>The result above looks convincing again, but if you are trying to copy everything into one Swift Playground it won&#8217;t compile. Why? If you compare the enums I posted here, you will see that it renamed some cases during the process (for whatever reason). However, this might also have something to do with my prompts. Maybe if you always add something like &#8220;make sure that this and this from before is included&#8221; it might work better.<\/p>\n\n\n\n<p>After going back and forth, telling ChatGPT what&#8217;s wrong, which case is missing, etc. you will get something that works. However, at this point I often realized that it might have been easier to just fix these bugs by yourself.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">What I learned so far<\/h2>\n\n\n\n<p>The talking about ChatGPT replacing software developers is BS in my opinion. You still need someone to guide it and this someone needs enough knowledge to know whether the responses make sense or not. Copying stuff straight from ChatGPT that does exactly what you want works for really easy things (e.g. creating SQL statements where you tell it the exact column names). For other cases (at least to me) it&#8217;s really great for returning a first idea (with good explanations) that you can manually improve.<\/p>\n\n\n\n<p>In addition to that, it&#8217;s great if you are unsure about how to tackle something, e.g. &#8220;What is the most efficient way of accessing\/updating\/whatever an array objects in Swift having these kind of properties&#8221;. It will give you a nice explanation with weighing in pros and cons of different approaches. If you don&#8217;t quite understand something, you can ask it for clarification.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusion<\/h2>\n\n\n\n<p>In the context of Swift iOS development at least to me ChatGPT is really great for learning e.g. how to properly access this or that? What is the advantage of doing it like this? Is there a better way of doing that? Questions like this lead to great results for me so far.<\/p>\n\n\n\n<p>For code generation it&#8217;s fun to use and it&#8217;s awesome to see what it can generate. However, often enough there are tons of bugs, when asking it for fixes, it mangles up other stuff, etc. For me at this point it&#8217;s best for creating early drafts that I can manually improve later on.<\/p>\n\n\n\n<p>Let&#8217;s see what comes with later updates, so far it looks really convincinv<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Lately, I also jumped onto the ChatGPT train and wanted to give it a try for the use in Swift development for the iOS platform. Here are my experiences so far using it for around 1 or two months now. How to get access without sharing your (real) phone number It&#8217;s still free and pretty&hellip;<\/p>\n","protected":false},"author":1,"featured_media":675,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"inline_featured_image":false,"footnotes":""},"categories":[3,60],"tags":[59,4,35],"class_list":["post-670","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ios-development","category-chatgpt","tag-chatgpt","tag-ios","tag-swift"],"_links":{"self":[{"href":"https:\/\/mic.st\/blog\/wp-json\/wp\/v2\/posts\/670","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/mic.st\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/mic.st\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/mic.st\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/mic.st\/blog\/wp-json\/wp\/v2\/comments?post=670"}],"version-history":[{"count":12,"href":"https:\/\/mic.st\/blog\/wp-json\/wp\/v2\/posts\/670\/revisions"}],"predecessor-version":[{"id":702,"href":"https:\/\/mic.st\/blog\/wp-json\/wp\/v2\/posts\/670\/revisions\/702"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/mic.st\/blog\/wp-json\/wp\/v2\/media\/675"}],"wp:attachment":[{"href":"https:\/\/mic.st\/blog\/wp-json\/wp\/v2\/media?parent=670"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/mic.st\/blog\/wp-json\/wp\/v2\/categories?post=670"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/mic.st\/blog\/wp-json\/wp\/v2\/tags?post=670"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}