{"id":1886,"date":"2023-03-26T22:02:24","date_gmt":"2023-03-26T22:02:24","guid":{"rendered":"https:\/\/dev95.site\/toggles-the-easiest-feature-flagging-in-swift\/"},"modified":"2023-03-26T22:02:24","modified_gmt":"2023-03-26T22:02:24","slug":"toggles-the-easiest-feature-flagging-in-swift","status":"publish","type":"post","link":"https:\/\/dev95.site\/ar\/toggles-the-easiest-feature-flagging-in-swift\/","title":{"rendered":"Toggles: the easiest feature flagging in Swift"},"content":{"rendered":"<div id=\"dev95-3217509008\" class=\"dev95-- dev95-entity-placement\"><script async=\"async\" data-cfasync=\"false\" src=\"https:\/\/pl27862732.profitableratecpmnetwork.com\/2ad7a50e0bbc23ac6801d7b77c501463\/invoke.js\"><\/script>\r\n<div id=\"container-2ad7a50e0bbc23ac6801d7b77c501463\"><\/div><\/div><div><img decoding=\"async\" src=\"https:\/\/images.unsplash.com\/photo-1644361566696-3d442b5b482a?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDN8fHRvZ2dsZXxlbnwwfHx8fDE2Nzk4Njc1NTE&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000\" alt=\"Toggles: the easiest feature flagging in Swift\"><\/p>\n<p>I previously wrote about <a href=\"https:\/\/github.com\/justeat\/JustTweak?ref=albertodebortoli.com\">JustTweak<\/a> <a href=\"https:\/\/albertodebortoli.com\/2019\/11\/26\/a-smart-feature-flagging-system-for-ios\/\">here<\/a>. It&#8217;s the feature flagging mechanism we&#8217;ve been using at Just Eat Takeaway.com to power the iOS consumer apps since 2017. It&#8217;s proved to be very stable and powerful and it has evolved over time. Friends have heard me promoting it vehemently and some have integrated it with success and appreciation. I don&#8217;t think I&#8217;ve promoted it in the community enough (it definitely deserved more) but marketing has never been my thing.<\/p><div id=\"dev95-1388161304\" class=\"dev95- dev95-entity-placement\"><center>\r\n<script>\r\n  atOptions = {\r\n    'key' : '4ba6b6513c00e0ba76511f798ae56401',\r\n    'format' : 'iframe',\r\n    'height' : 50,\r\n    'width' : 320,\r\n    'params' : {}\r\n  };\r\n<\/script>\r\n<script src=\"https:\/\/www.highrevenueformat.com\/4ba6b6513c00e0ba76511f798ae56401\/invoke.js\"><\/script>\r\n\t<\/center><\/div>\n<p>Anyway, JustTweak grew old and some changes were debatable and not to my taste. I have then decided to use the knowledge of years of working on the feature flagging matter to give this project a new life by rewriting it from scratch as a personal project.<\/p>\n<p>And here it is: <a href=\"https:\/\/github.com\/TogglesPlatform\/Toggles?ref=albertodebortoli.com\">Toggles<\/a>.<\/p>\n<figure class=\"kg-card kg-embed-card\">\n<blockquote class=\"twitter-tweet\">\n<p lang=\"en\" dir=\"ltr\">I never tweeted about this side project of mine \ud83d\ude1c<br \/>It&#8217;s like JustTweak (feature flagging), but sensibly better. <a href=\"https:\/\/t.co\/bdGWuUyQEU?ref=albertodebortoli.com\">https:\/\/t.co\/bdGWuUyQEU<\/a> <a href=\"https:\/\/twitter.com\/hashtag\/Swift?src=hash&amp;ref_src=twsrc%5Etfw&amp;ref=albertodebortoli.com\">#Swift<\/a> <a href=\"https:\/\/twitter.com\/hashtag\/iOS?src=hash&amp;ref_src=twsrc%5Etfw&amp;ref=albertodebortoli.com\">#iOS<\/a> <a href=\"https:\/\/twitter.com\/hashtag\/macOS?src=hash&amp;ref_src=twsrc%5Etfw&amp;ref=albertodebortoli.com\">#macOS<\/a><\/p>\n<p>\u2014 Alberto De Bortoli (@albertodebo) <a href=\"https:\/\/twitter.com\/albertodebo\/status\/1638851577468588032?ref_src=twsrc%5Etfw&amp;ref=albertodebortoli.com\">March 23, 2023<\/a><\/p><\/blockquote>\n<p><script async src=\"https:\/\/platform.twitter.com\/widgets.js\" charset=\"utf-8\"><\/script><br \/>\n<\/figure>\n<p>Think of JustTweak, but better. A lot better. Frankly, I couldn&#8217;t have written it better. Here are the main highlights:<\/p>\n<ul>\n<li>brand new code, obsessively optimized and kept as short and simple as possible<\/li>\n<li>extreme performances<\/li>\n<li>fully tested<\/li>\n<li>fully documented<\/li>\n<li>performant UI debug view in SwiftUI<\/li>\n<li>standard providers provided<\/li>\n<li>demo app provided<\/li>\n<li>ability to listen for value changes (using Combine)<\/li>\n<li>simpler APIs<\/li>\n<li>ToggleGen CLI, to allow code generation<\/li>\n<li>ToggleCipher CLI, to allow encoding\/decoding of secrets<\/li>\n<li>JustTweakMigrator CLI, to allow a smooth transition from JustTweak<\/li>\n<\/ul>\n<figure class=\"kg-card kg-image-card\"><img data-recalc-dims=\"1\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/storage.ghost.io\/c\/ae\/f4\/aef4d625-32a2-417b-86f4-22c70a9b47a1\/content\/images\/2023\/03\/DemoApp_iPad.png?resize=1280%2C926&#038;ssl=1\" class=\"kg-image\" alt=\"Toggles: the easiest feature flagging in Swift\" loading=\"lazy\" width=\"1280\" height=\"926\" srcset=\"https:\/\/storage.ghost.io\/c\/ae\/f4\/aef4d625-32a2-417b-86f4-22c70a9b47a1\/content\/images\/size\/w600\/2023\/03\/DemoApp_iPad.png 600w, https:\/\/storage.ghost.io\/c\/ae\/f4\/aef4d625-32a2-417b-86f4-22c70a9b47a1\/content\/images\/size\/w1000\/2023\/03\/DemoApp_iPad.png 1000w, https:\/\/storage.ghost.io\/c\/ae\/f4\/aef4d625-32a2-417b-86f4-22c70a9b47a1\/content\/images\/2023\/03\/DemoApp_iPad.png 1560w\" sizes=\"auto, (min-width: 720px) 720px\"><\/figure>\n<p>Read all about it on the <a href=\"https:\/\/github.com\/TogglesPlatform\/Toggles?ref=albertodebortoli.com#readme\">repo&#8217;s README<\/a> and on the <a href=\"https:\/\/togglesplatform.github.io\/Toggles\/documentation\/toggles\/?ref=albertodebortoli.com\">DocC page<\/a>.<\/p>\n<p>It&#8217;s on Swift Package Index too.<\/p>\n<figure class=\"kg-card kg-bookmark-card\"><a class=\"kg-bookmark-container\" href=\"https:\/\/swiftpackageindex.com\/TogglesPlatform\/Toggles?ref=albertodebortoli.com\"><\/p>\n<div class=\"kg-bookmark-content\">\n<div class=\"kg-bookmark-title\">Toggles \u2013 Swift Package Index<\/div>\n<p><small><\/p>\n<div class=\"kg-bookmark-description\">Toggles by TogglesPlatform on the Swift Package Index \u2013 Toggles is an elegant and powerful solution to feature flagging for Apple platforms.<\/div>\n<p><\/small><\/div>\n<p><\/a><\/figure>\n<p>There are plans (or at least the desire!) to write a backend with <a href=\"https:\/\/twitter.com\/andreascuderi13?ref=albertodebortoli.com\">Andrea Scuderi<\/a>. That&#8217;d be really nice!<\/p>\n<figure class=\"kg-card kg-embed-card\">\n<blockquote class=\"twitter-tweet\">\n<p lang=\"en\" dir=\"ltr\"><a href=\"https:\/\/twitter.com\/albertodebo?ref_src=twsrc%5Etfw&amp;ref=albertodebortoli.com\">@albertodebo<\/a> This wasn&#8217;t planned! It looks like we need to build the backend for <a href=\"https:\/\/twitter.com\/hashtag\/Toggles?src=hash&amp;ref_src=twsrc%5Etfw&amp;ref=albertodebortoli.com\">#Toggles<\/a> with <a href=\"https:\/\/twitter.com\/hashtag\/Breeze?src=hash&amp;ref_src=twsrc%5Etfw&amp;ref=albertodebortoli.com\">#Breeze<\/a>! <a href=\"https:\/\/t.co\/OxNovRl70L?ref=albertodebortoli.com\">pic.twitter.com\/OxNovRl70L<\/a><\/p>\n<p>\u2014 andreascuderi (@andreascuderi13) <a href=\"https:\/\/twitter.com\/andreascuderi13\/status\/1640105067381506049?ref_src=twsrc%5Etfw&amp;ref=albertodebortoli.com\">March 26, 2023<\/a><\/p><\/blockquote>\n<p><script async src=\"https:\/\/platform.twitter.com\/widgets.js\" charset=\"utf-8\"><\/script><br \/>\n<\/figure>\n<\/div>\n<div class=\"pvc_clear\"><\/div>\n<p id=\"pvc_stats_1886\" class=\"pvc_stats total_only\" data-element-id=\"1886\" style=\"\"><i class=\"pvc-stats-icon medium\" aria-hidden=\"true\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" version=\"1.0\" viewbox=\"0 0 502 315\" preserveaspectratio=\"xMidYMid meet\"><g transform=\"translate(0,332) scale(0.1,-0.1)\" fill=\"\" stroke=\"none\"><path d=\"M2394 3279 l-29 -30 -3 -207 c-2 -182 0 -211 15 -242 39 -76 157 -76 196 0 15 31 17 60 15 243 l-3 209 -33 29 c-26 23 -41 29 -80 29 -41 0 -53 -5 -78 -31z\"\/><path d=\"M3085 3251 c-45 -19 -58 -50 -96 -229 -47 -217 -49 -260 -13 -295 52 -53 146 -42 177 20 16 31 87 366 87 410 0 70 -86 122 -155 94z\"\/><path d=\"M1751 3234 c-13 -9 -29 -31 -37 -50 -12 -29 -10 -49 21 -204 19 -94 39 -189 45 -210 14 -50 54 -80 110 -80 34 0 48 6 76 34 21 21 34 44 34 59 0 14 -18 113 -40 219 -37 178 -43 195 -70 221 -36 32 -101 37 -139 11z\"\/><path d=\"M1163 3073 c-36 -7 -73 -59 -73 -102 0 -56 133 -378 171 -413 34 -32 83 -37 129 -13 70 36 67 87 -16 290 -86 209 -89 214 -129 231 -35 14 -42 15 -82 7z\"\/><path d=\"M3689 3066 c-15 -9 -33 -30 -42 -48 -48 -103 -147 -355 -147 -375 0 -98 131 -148 192 -74 13 15 57 108 97 206 80 196 84 226 37 273 -30 30 -99 39 -137 18z\"\/><path d=\"M583 2784 c-38 -19 -67 -74 -58 -113 9 -42 211 -354 242 -373 16 -10 45 -18 66 -18 51 0 107 52 107 100 0 39 -1 41 -124 234 -80 126 -108 162 -133 173 -41 17 -61 16 -100 -3z\"\/><path d=\"M4250 2784 c-14 -9 -74 -91 -133 -183 -95 -150 -107 -173 -107 -213 0 -55 33 -94 87 -104 67 -13 90 8 211 198 130 202 137 225 78 284 -27 27 -42 34 -72 34 -22 0 -50 -8 -64 -16z\"\/><path d=\"M2275 2693 c-553 -48 -1095 -270 -1585 -649 -135 -104 -459 -423 -483 -476 -23 -49 -22 -139 2 -186 73 -142 361 -457 571 -626 285 -228 642 -407 990 -497 242 -63 336 -73 660 -74 310 0 370 5 595 52 535 111 1045 392 1455 803 122 121 250 273 275 326 19 41 19 137 0 174 -41 79 -309 363 -465 492 -447 370 -946 591 -1479 653 -113 14 -422 18 -536 8z m395 -428 c171 -34 330 -124 456 -258 112 -119 167 -219 211 -378 27 -96 24 -300 -5 -401 -72 -255 -236 -447 -474 -557 -132 -62 -201 -76 -368 -76 -167 0 -236 14 -368 76 -213 98 -373 271 -451 485 -162 444 86 934 547 1084 153 49 292 57 452 25z m909 -232 c222 -123 408 -262 593 -441 76 -74 138 -139 138 -144 0 -16 -233 -242 -330 -319 -155 -123 -309 -223 -461 -299 l-81 -41 32 46 c18 26 49 83 70 128 143 306 141 649 -6 957 -25 52 -61 116 -79 142 l-34 47 45 -20 c26 -10 76 -36 113 -56z m-2057 25 c-40 -58 -105 -190 -130 -263 -110 -324 -59 -707 132 -981 25 -35 42 -64 37 -64 -19 0 -241 119 -326 174 -188 122 -406 314 -532 468 l-58 71 108 103 c185 178 428 349 672 473 66 33 121 60 123 61 2 0 -10 -19 -26 -42z\"\/><path d=\"M2375 1950 c-198 -44 -350 -190 -395 -379 -18 -76 -8 -221 19 -290 114 -284 457 -406 731 -260 98 52 188 154 231 260 27 69 37 214 19 290 -38 163 -166 304 -326 360 -67 23 -215 33 -279 19z\"\/><\/g><\/svg><\/i> <img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"16\" height=\"16\" alt=\"Loading\" src=\"https:\/\/i0.wp.com\/dev95.site\/wp-content\/plugins\/page-views-count\/ajax-loader-2x.gif?resize=16%2C16&#038;ssl=1\" border=\"0\" \/><\/p>\n<div class=\"pvc_clear\"><\/div>","protected":false},"excerpt":{"rendered":"<p>I previously wrote about JustTweak here. It&#8217;s the feature flagging mechanism we&#8217;ve been using at Just Eat Takeaway.com to power the iOS consumer apps since 2017. It&#8217;s proved to be very stable and powerful and it has evolved over time.<\/p>\n<div class=\"hosteria-entry-more\"><a href=\"https:\/\/dev95.site\/ar\/toggles-the-easiest-feature-flagging-in-swift\/\" class=\"no-underline font-light  group-hover:text-primary-800 dark:group-hover:text-primary-300 py-1\">Read more &gt;&gt;&gt;<\/a><\/div>\n<div class=\"pvc_clear\"><\/div>\n<p id=\"pvc_stats_1886\" class=\"pvc_stats total_only\" data-element-id=\"1886\" style=\"\"><i class=\"pvc-stats-icon medium\" aria-hidden=\"true\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" version=\"1.0\" viewbox=\"0 0 502 315\" preserveaspectratio=\"xMidYMid meet\"><g transform=\"translate(0,332) scale(0.1,-0.1)\" fill=\"\" stroke=\"none\"><path d=\"M2394 3279 l-29 -30 -3 -207 c-2 -182 0 -211 15 -242 39 -76 157 -76 196 0 15 31 17 60 15 243 l-3 209 -33 29 c-26 23 -41 29 -80 29 -41 0 -53 -5 -78 -31z\"\/><path d=\"M3085 3251 c-45 -19 -58 -50 -96 -229 -47 -217 -49 -260 -13 -295 52 -53 146 -42 177 20 16 31 87 366 87 410 0 70 -86 122 -155 94z\"\/><path d=\"M1751 3234 c-13 -9 -29 -31 -37 -50 -12 -29 -10 -49 21 -204 19 -94 39 -189 45 -210 14 -50 54 -80 110 -80 34 0 48 6 76 34 21 21 34 44 34 59 0 14 -18 113 -40 219 -37 178 -43 195 -70 221 -36 32 -101 37 -139 11z\"\/><path d=\"M1163 3073 c-36 -7 -73 -59 -73 -102 0 -56 133 -378 171 -413 34 -32 83 -37 129 -13 70 36 67 87 -16 290 -86 209 -89 214 -129 231 -35 14 -42 15 -82 7z\"\/><path d=\"M3689 3066 c-15 -9 -33 -30 -42 -48 -48 -103 -147 -355 -147 -375 0 -98 131 -148 192 -74 13 15 57 108 97 206 80 196 84 226 37 273 -30 30 -99 39 -137 18z\"\/><path d=\"M583 2784 c-38 -19 -67 -74 -58 -113 9 -42 211 -354 242 -373 16 -10 45 -18 66 -18 51 0 107 52 107 100 0 39 -1 41 -124 234 -80 126 -108 162 -133 173 -41 17 -61 16 -100 -3z\"\/><path d=\"M4250 2784 c-14 -9 -74 -91 -133 -183 -95 -150 -107 -173 -107 -213 0 -55 33 -94 87 -104 67 -13 90 8 211 198 130 202 137 225 78 284 -27 27 -42 34 -72 34 -22 0 -50 -8 -64 -16z\"\/><path d=\"M2275 2693 c-553 -48 -1095 -270 -1585 -649 -135 -104 -459 -423 -483 -476 -23 -49 -22 -139 2 -186 73 -142 361 -457 571 -626 285 -228 642 -407 990 -497 242 -63 336 -73 660 -74 310 0 370 5 595 52 535 111 1045 392 1455 803 122 121 250 273 275 326 19 41 19 137 0 174 -41 79 -309 363 -465 492 -447 370 -946 591 -1479 653 -113 14 -422 18 -536 8z m395 -428 c171 -34 330 -124 456 -258 112 -119 167 -219 211 -378 27 -96 24 -300 -5 -401 -72 -255 -236 -447 -474 -557 -132 -62 -201 -76 -368 -76 -167 0 -236 14 -368 76 -213 98 -373 271 -451 485 -162 444 86 934 547 1084 153 49 292 57 452 25z m909 -232 c222 -123 408 -262 593 -441 76 -74 138 -139 138 -144 0 -16 -233 -242 -330 -319 -155 -123 -309 -223 -461 -299 l-81 -41 32 46 c18 26 49 83 70 128 143 306 141 649 -6 957 -25 52 -61 116 -79 142 l-34 47 45 -20 c26 -10 76 -36 113 -56z m-2057 25 c-40 -58 -105 -190 -130 -263 -110 -324 -59 -707 132 -981 25 -35 42 -64 37 -64 -19 0 -241 119 -326 174 -188 122 -406 314 -532 468 l-58 71 108 103 c185 178 428 349 672 473 66 33 121 60 123 61 2 0 -10 -19 -26 -42z\"\/><path d=\"M2375 1950 c-198 -44 -350 -190 -395 -379 -18 -76 -8 -221 19 -290 114 -284 457 -406 731 -260 98 52 188 154 231 260 27 69 37 214 19 290 -38 163 -166 304 -326 360 -67 23 -215 33 -279 19z\"\/><\/g><\/svg><\/i> <img loading=\"lazy\" decoding=\"async\" width=\"16\" height=\"16\" alt=\"Loading\" src=\"https:\/\/dev95.site\/wp-content\/plugins\/page-views-count\/ajax-loader-2x.gif\" border=\"0\" \/><\/p>\n<div class=\"pvc_clear\"><\/div>","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"fp_fajr_begins":"","fp_fajr_iqamah":"","fp_dhuhr_begins":"","fp_dhuhr_iqamah":"","fp_asr_begins":"","fp_asr_iqamah":"","fp_maghrib_begins":"","fp_maghrib_iqamah":"","fp_isha_begins":"","fp_isha_iqamah":"","fp_midnight":"","fp_midnight_name":"","fp_sunrise":"","fp_single_prayer_begins_title":"","fp_single_prayer_iqamah_title":"","fp_prayer_times_for_today":"","fp_hijra_date":"","fp_fajr_name":"","fp_dhuhr_name":"","fp_asr_name":"","fp_maghrib_name":"","fp_isha_name":"","fp_sunrise_name":"","fp_currentDate":"","fp_current_time":"","fp_current_title":"","fp_current_location":"","fp_masjid_name":"","fp_prayer_title":"","fp_next_prayer_iqamah_time":"","fp_next_prayer_iqamah_title":"","fp_next_prayer_begins_time":"","fp_next_prayer_begins_title":"","fp_next_prayer_title":"","_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_post_was_ever_published":false},"categories":[37],"tags":[],"class_list":["post-1886","post","type-post","status-publish","format-standard","hentry","category-posts"],"a3_pvc":{"activated":true,"total_views":0,"today_views":0},"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Toggles: the easiest feature flagging in Swift - Dev95<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/dev95.site\/ar\/toggles-the-easiest-feature-flagging-in-swift\/\" \/>\n<meta property=\"og:locale\" content=\"ar_AR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Toggles: the easiest feature flagging in Swift - Dev95\" \/>\n<meta property=\"og:description\" content=\"I previously wrote about JustTweak here. It&#8217;s the feature flagging mechanism we&#8217;ve been using at Just Eat Takeaway.com to power the iOS consumer apps since 2017. It&#8217;s proved to be very stable and powerful and it has evolved over time.Read more &gt;&gt;&gt;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/dev95.site\/ar\/toggles-the-easiest-feature-flagging-in-swift\/\" \/>\n<meta property=\"og:site_name\" content=\"Dev95\" \/>\n<meta property=\"article:published_time\" content=\"2023-03-26T22:02:24+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/images.unsplash.com\/photo-1644361566696-3d442b5b482a?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDN8fHRvZ2dsZXxlbnwwfHx8fDE2Nzk4Njc1NTE&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000\" \/>\n<meta name=\"author\" content=\"dev95\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u0643\u064f\u062a\u0628 \u0628\u0648\u0627\u0633\u0637\u0629\" \/>\n\t<meta name=\"twitter:data1\" content=\"dev95\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u0648\u0642\u062a \u0627\u0644\u0642\u0631\u0627\u0621\u0629 \u0627\u0644\u0645\u064f\u0642\u062f\u0651\u0631\" \/>\n\t<meta name=\"twitter:data2\" content=\"\u062f\u0642\u064a\u0642\u062a\u0627\u0646\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/dev95.site\\\/toggles-the-easiest-feature-flagging-in-swift\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/dev95.site\\\/toggles-the-easiest-feature-flagging-in-swift\\\/\"},\"author\":{\"name\":\"dev95\",\"@id\":\"https:\\\/\\\/dev95.site\\\/#\\\/schema\\\/person\\\/b807805ffe2916206b04d0938bce0298\"},\"headline\":\"Toggles: the easiest feature flagging in Swift\",\"datePublished\":\"2023-03-26T22:02:24+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/dev95.site\\\/toggles-the-easiest-feature-flagging-in-swift\\\/\"},\"wordCount\":348,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/dev95.site\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/dev95.site\\\/toggles-the-easiest-feature-flagging-in-swift\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/images.unsplash.com\\\/photo-1644361566696-3d442b5b482a?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDN8fHRvZ2dsZXxlbnwwfHx8fDE2Nzk4Njc1NTE&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000\",\"articleSection\":[\"Posts\"],\"inLanguage\":\"ar\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/dev95.site\\\/toggles-the-easiest-feature-flagging-in-swift\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/dev95.site\\\/toggles-the-easiest-feature-flagging-in-swift\\\/\",\"url\":\"https:\\\/\\\/dev95.site\\\/toggles-the-easiest-feature-flagging-in-swift\\\/\",\"name\":\"Toggles: the easiest feature flagging in Swift - Dev95\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/dev95.site\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/dev95.site\\\/toggles-the-easiest-feature-flagging-in-swift\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/dev95.site\\\/toggles-the-easiest-feature-flagging-in-swift\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/images.unsplash.com\\\/photo-1644361566696-3d442b5b482a?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDN8fHRvZ2dsZXxlbnwwfHx8fDE2Nzk4Njc1NTE&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000\",\"datePublished\":\"2023-03-26T22:02:24+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/dev95.site\\\/toggles-the-easiest-feature-flagging-in-swift\\\/#breadcrumb\"},\"inLanguage\":\"ar\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/dev95.site\\\/toggles-the-easiest-feature-flagging-in-swift\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"ar\",\"@id\":\"https:\\\/\\\/dev95.site\\\/toggles-the-easiest-feature-flagging-in-swift\\\/#primaryimage\",\"url\":\"https:\\\/\\\/images.unsplash.com\\\/photo-1644361566696-3d442b5b482a?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDN8fHRvZ2dsZXxlbnwwfHx8fDE2Nzk4Njc1NTE&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000\",\"contentUrl\":\"https:\\\/\\\/images.unsplash.com\\\/photo-1644361566696-3d442b5b482a?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDN8fHRvZ2dsZXxlbnwwfHx8fDE2Nzk4Njc1NTE&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/dev95.site\\\/toggles-the-easiest-feature-flagging-in-swift\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/dev95.site\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Toggles: the easiest feature flagging in Swift\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/dev95.site\\\/#website\",\"url\":\"https:\\\/\\\/dev95.site\\\/\",\"name\":\"Dev95\",\"description\":\"A comprehensive platform for data and knowledge, delivering reliable content that meets the aspirations of readers and enthusiasts.\",\"publisher\":{\"@id\":\"https:\\\/\\\/dev95.site\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/dev95.site\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"ar\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/dev95.site\\\/#organization\",\"name\":\"Dev95\",\"url\":\"https:\\\/\\\/dev95.site\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"ar\",\"@id\":\"https:\\\/\\\/dev95.site\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/i0.wp.com\\\/dev95.site\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/rbrrbr-6.png?fit=512%2C512&ssl=1\",\"contentUrl\":\"https:\\\/\\\/i0.wp.com\\\/dev95.site\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/rbrrbr-6.png?fit=512%2C512&ssl=1\",\"width\":512,\"height\":512,\"caption\":\"Dev95\"},\"image\":{\"@id\":\"https:\\\/\\\/dev95.site\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/dev95.site\\\/#\\\/schema\\\/person\\\/b807805ffe2916206b04d0938bce0298\",\"name\":\"dev95\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"ar\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/a70a73d950838b20cd80d7ebdc955737e802e8cd896044c5473b32b946c0662a?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/a70a73d950838b20cd80d7ebdc955737e802e8cd896044c5473b32b946c0662a?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/a70a73d950838b20cd80d7ebdc955737e802e8cd896044c5473b32b946c0662a?s=96&d=mm&r=g\",\"caption\":\"dev95\"},\"url\":\"https:\\\/\\\/dev95.site\\\/ar\\\/author\\\/mohammad\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Toggles: the easiest feature flagging in Swift - Dev95","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/dev95.site\/ar\/toggles-the-easiest-feature-flagging-in-swift\/","og_locale":"ar_AR","og_type":"article","og_title":"Toggles: the easiest feature flagging in Swift - Dev95","og_description":"I previously wrote about JustTweak here. It&#8217;s the feature flagging mechanism we&#8217;ve been using at Just Eat Takeaway.com to power the iOS consumer apps since 2017. It&#8217;s proved to be very stable and powerful and it has evolved over time.Read more &gt;&gt;&gt;","og_url":"https:\/\/dev95.site\/ar\/toggles-the-easiest-feature-flagging-in-swift\/","og_site_name":"Dev95","article_published_time":"2023-03-26T22:02:24+00:00","og_image":[{"url":"https:\/\/images.unsplash.com\/photo-1644361566696-3d442b5b482a?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDN8fHRvZ2dsZXxlbnwwfHx8fDE2Nzk4Njc1NTE&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000","type":"","width":"","height":""}],"author":"dev95","twitter_card":"summary_large_image","twitter_misc":{"\u0643\u064f\u062a\u0628 \u0628\u0648\u0627\u0633\u0637\u0629":"dev95","\u0648\u0642\u062a \u0627\u0644\u0642\u0631\u0627\u0621\u0629 \u0627\u0644\u0645\u064f\u0642\u062f\u0651\u0631":"\u062f\u0642\u064a\u0642\u062a\u0627\u0646"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/dev95.site\/toggles-the-easiest-feature-flagging-in-swift\/#article","isPartOf":{"@id":"https:\/\/dev95.site\/toggles-the-easiest-feature-flagging-in-swift\/"},"author":{"name":"dev95","@id":"https:\/\/dev95.site\/#\/schema\/person\/b807805ffe2916206b04d0938bce0298"},"headline":"Toggles: the easiest feature flagging in Swift","datePublished":"2023-03-26T22:02:24+00:00","mainEntityOfPage":{"@id":"https:\/\/dev95.site\/toggles-the-easiest-feature-flagging-in-swift\/"},"wordCount":348,"commentCount":0,"publisher":{"@id":"https:\/\/dev95.site\/#organization"},"image":{"@id":"https:\/\/dev95.site\/toggles-the-easiest-feature-flagging-in-swift\/#primaryimage"},"thumbnailUrl":"https:\/\/images.unsplash.com\/photo-1644361566696-3d442b5b482a?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDN8fHRvZ2dsZXxlbnwwfHx8fDE2Nzk4Njc1NTE&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000","articleSection":["Posts"],"inLanguage":"ar","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/dev95.site\/toggles-the-easiest-feature-flagging-in-swift\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/dev95.site\/toggles-the-easiest-feature-flagging-in-swift\/","url":"https:\/\/dev95.site\/toggles-the-easiest-feature-flagging-in-swift\/","name":"Toggles: the easiest feature flagging in Swift - Dev95","isPartOf":{"@id":"https:\/\/dev95.site\/#website"},"primaryImageOfPage":{"@id":"https:\/\/dev95.site\/toggles-the-easiest-feature-flagging-in-swift\/#primaryimage"},"image":{"@id":"https:\/\/dev95.site\/toggles-the-easiest-feature-flagging-in-swift\/#primaryimage"},"thumbnailUrl":"https:\/\/images.unsplash.com\/photo-1644361566696-3d442b5b482a?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDN8fHRvZ2dsZXxlbnwwfHx8fDE2Nzk4Njc1NTE&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000","datePublished":"2023-03-26T22:02:24+00:00","breadcrumb":{"@id":"https:\/\/dev95.site\/toggles-the-easiest-feature-flagging-in-swift\/#breadcrumb"},"inLanguage":"ar","potentialAction":[{"@type":"ReadAction","target":["https:\/\/dev95.site\/toggles-the-easiest-feature-flagging-in-swift\/"]}]},{"@type":"ImageObject","inLanguage":"ar","@id":"https:\/\/dev95.site\/toggles-the-easiest-feature-flagging-in-swift\/#primaryimage","url":"https:\/\/images.unsplash.com\/photo-1644361566696-3d442b5b482a?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDN8fHRvZ2dsZXxlbnwwfHx8fDE2Nzk4Njc1NTE&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000","contentUrl":"https:\/\/images.unsplash.com\/photo-1644361566696-3d442b5b482a?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDN8fHRvZ2dsZXxlbnwwfHx8fDE2Nzk4Njc1NTE&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000"},{"@type":"BreadcrumbList","@id":"https:\/\/dev95.site\/toggles-the-easiest-feature-flagging-in-swift\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/dev95.site\/"},{"@type":"ListItem","position":2,"name":"Toggles: the easiest feature flagging in Swift"}]},{"@type":"WebSite","@id":"https:\/\/dev95.site\/#website","url":"https:\/\/dev95.site\/","name":"Dev95","description":"A comprehensive platform for data and knowledge, delivering reliable content that meets the aspirations of readers and enthusiasts.","publisher":{"@id":"https:\/\/dev95.site\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/dev95.site\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"ar"},{"@type":"Organization","@id":"https:\/\/dev95.site\/#organization","name":"Dev95","url":"https:\/\/dev95.site\/","logo":{"@type":"ImageObject","inLanguage":"ar","@id":"https:\/\/dev95.site\/#\/schema\/logo\/image\/","url":"https:\/\/i0.wp.com\/dev95.site\/wp-content\/uploads\/2026\/07\/rbrrbr-6.png?fit=512%2C512&ssl=1","contentUrl":"https:\/\/i0.wp.com\/dev95.site\/wp-content\/uploads\/2026\/07\/rbrrbr-6.png?fit=512%2C512&ssl=1","width":512,"height":512,"caption":"Dev95"},"image":{"@id":"https:\/\/dev95.site\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/dev95.site\/#\/schema\/person\/b807805ffe2916206b04d0938bce0298","name":"dev95","image":{"@type":"ImageObject","inLanguage":"ar","@id":"https:\/\/secure.gravatar.com\/avatar\/a70a73d950838b20cd80d7ebdc955737e802e8cd896044c5473b32b946c0662a?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/a70a73d950838b20cd80d7ebdc955737e802e8cd896044c5473b32b946c0662a?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/a70a73d950838b20cd80d7ebdc955737e802e8cd896044c5473b32b946c0662a?s=96&d=mm&r=g","caption":"dev95"},"url":"https:\/\/dev95.site\/ar\/author\/mohammad\/"}]}},"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/dev95.site\/ar\/wp-json\/wp\/v2\/posts\/1886","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dev95.site\/ar\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/dev95.site\/ar\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/dev95.site\/ar\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/dev95.site\/ar\/wp-json\/wp\/v2\/comments?post=1886"}],"version-history":[{"count":0,"href":"https:\/\/dev95.site\/ar\/wp-json\/wp\/v2\/posts\/1886\/revisions"}],"wp:attachment":[{"href":"https:\/\/dev95.site\/ar\/wp-json\/wp\/v2\/media?parent=1886"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dev95.site\/ar\/wp-json\/wp\/v2\/categories?post=1886"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dev95.site\/ar\/wp-json\/wp\/v2\/tags?post=1886"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}