{"id":10545,"date":"2019-12-26T00:00:00","date_gmt":"2019-12-26T00:00:00","guid":{"rendered":"https:\/\/dev95.site\/building-better-views-part-ii-next-steps\/"},"modified":"2019-12-26T00:00:00","modified_gmt":"2019-12-26T00:00:00","slug":"building-better-views-part-ii-next-steps","status":"publish","type":"post","link":"https:\/\/dev95.site\/ar\/building-better-views-part-ii-next-steps\/","title":{"rendered":"Building Better Views (Part II), Next Steps"},"content":{"rendered":"<div id=\"dev95-1433362445\" class=\"dev95-- dev95-entity-placement\" role=\"region\" aria-label=\"\u0627\u0644\u0625\u0639\u0644\u0627\u0646\u0627\u062a\"><script async=\"async\" data-cfasync=\"false\" src=\"https:\/\/pl27862732.profitableratecpmnetwork.com\/2ad7a50e0bbc23ac6801d7b77c501463\/invoke.js\"><\/script>\r\n<div id=\"container-2ad7a50e0bbc23ac6801d7b77c501463\"><\/div><\/div><div id=\"dev95-1818280671\" class=\"dev95-before-content dev95-entity-placement\" role=\"region\" aria-label=\"\u0627\u0644\u0625\u0639\u0644\u0627\u0646\u0627\u062a\"><p style=\"text-align: center;\"><strong>Stop wasting time on dead links! \ud83d\uded1 This smart platform automatically detects your device and country to give you the exact best offer instantly. Check it out now 100% free! \ud83d\udc47<\/strong><br data-sfc-root=\"ep\" data-sfc-pl=\"|||[]\" data-complete=\"true\" data-copy-service-computed-style=\"font-family: Arial, sans-serif, &quot;Noto Color Emoji&quot;; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);\" \/><a href=\"https:\/\/www.profitableratecpmnetwork.com\/pvhx5mbcc?key=ff7d362db3c20bc86fad685cc94f1fc4\">\ud83d\udd17 <strong class=\"rQesXe MPyX\" data-sfc-cp=\"\" data-sfc-root=\"ep\" data-complete=\"true\" aria-owns=\"action-menu-parent-container\" data-copy-service-computed-style=\"font-family: Arial, sans-serif, &quot;Noto Color Emoji&quot;; font-size: 16px; font-weight: 700; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);\">[Click here]<\/strong><\/a><\/p>\n<\/div><div>\n<p>If you haven&#8217;t checked out <a href=\"https:\/\/fabisevi.ch\/2019\/12\/26\/building-better-views-part-i\">Part I<\/a>, I recommend reading it because if you don&#8217;t, none of writing below will make sense!<\/p><div id=\"dev95-3890123933\" class=\"dev95- dev95-entity-placement\" role=\"region\" aria-label=\"\u0627\u0644\u0625\u0639\u0644\u0627\u0646\u0627\u062a\"><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><!--preview-snippet--><\/p>\n<h2 id=\"three-unanswered-questions\" style=\"position:relative;\"><a href=\"https:\/\/fabisevi.ch\/2019\/12\/26\/building-better-views-part-ii\/#three-unanswered-questions\" aria-label=\"three unanswered questions permalink\" class=\"anchor before\"><svg class=\"header-link\" aria-hidden=\"true\" height=\"24\" version=\"1.1\" viewbox=\"0.5 -2 16 16\" width=\"24\"><path fill=\"currentColor\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"><\/path><\/svg><\/a>Three Unanswered Questions<\/h2>\n<h4 id=\"1-what-happens-when-the-views-you-want-to-configure-are-more-complex\" style=\"position:relative;\"><a href=\"https:\/\/fabisevi.ch\/2019\/12\/26\/building-better-views-part-ii\/#1-what-happens-when-the-views-you-want-to-configure-are-more-complex\" aria-label=\"1 what happens when the views you want to configure are more complex permalink\" class=\"anchor before\"><svg class=\"header-link\" aria-hidden=\"true\" height=\"24\" version=\"1.1\" viewbox=\"0.5 -2 16 16\" width=\"24\"><path fill=\"currentColor\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"><\/path><\/svg><\/a>1. What happens when the views you want to configure are more complex?<\/h4>\n<p>My recommended approach is to construct a one-time use struct, specifically for displaying in that one place. This type should only have the properties you need to render the view.<\/p>\n<div class=\"gatsby-highlight\" data-language=\"swift\">\n<pre class=\"language-swift\"><code class=\"language-swift\"><span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">HomeScreenCourseProgressViewDisplay<\/span> <span class=\"token punctuation\">{<\/span>\n    <span class=\"token keyword\">let<\/span> course<span class=\"token punctuation\">:<\/span> <span class=\"token class-name\">Course<\/span>\n    <span class=\"token keyword\">let<\/span> enrollment<span class=\"token punctuation\">:<\/span> <span class=\"token class-name\">Enrollment<\/span>\n    <span class=\"token keyword\">let<\/span> customization<span class=\"token punctuation\">:<\/span> <span class=\"token class-name\">SchoolCustomization<\/span>\n<span class=\"token punctuation\">}<\/span><\/code><\/pre>\n<\/div>\n<p>Creating the <code class=\"language-text\">ViewData<\/code> should look familiar. We&#8217;re going to do the exact same thing we did before.<\/p>\n<div class=\"gatsby-highlight\" data-language=\"swift\">\n<pre class=\"language-swift\"><code class=\"language-swift\"><span class=\"token keyword\">extension<\/span> <span class=\"token class-name\">HomeScreenCourseProgressViewDisplay<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token class-name\">CourseProgressViewData<\/span> <span class=\"token punctuation\">{<\/span>\n\n    <span class=\"token keyword\">var<\/span> titleLabelText<span class=\"token punctuation\">:<\/span> <span class=\"token class-name\">String<\/span> <span class=\"token punctuation\">{<\/span>\n        <span class=\"token keyword\">return<\/span> <span class=\"token keyword\">self<\/span><span class=\"token punctuation\">.<\/span>course<span class=\"token punctuation\">.<\/span>name\n    <span class=\"token punctuation\">}<\/span>\n\n    <span class=\"token keyword\">var<\/span> subtitleLabelText<span class=\"token punctuation\">:<\/span> <span class=\"token class-name\">String<\/span> <span class=\"token punctuation\">{<\/span>\n        <span class=\"token keyword\">return<\/span> <span class=\"token keyword\">self<\/span><span class=\"token punctuation\">.<\/span>course<span class=\"token punctuation\">.<\/span>author<span class=\"token punctuation\">.<\/span>name\n    <span class=\"token punctuation\">}<\/span>\n    \n    <span class=\"token keyword\">var<\/span> statusLabelText<span class=\"token punctuation\">:<\/span> <span class=\"token class-name\">String<\/span> <span class=\"token punctuation\">{<\/span>\n        <span class=\"token keyword\">return<\/span> <span class=\"token class-name\">String<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">localizedStringWithFormat<\/span><span class=\"token punctuation\">(<\/span><span class=\"token class-name\">NSLocalizedString<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string-literal\"><span class=\"token string\">\"%@% complete\"<\/span><\/span><span class=\"token punctuation\">,<\/span> comment<span class=\"token punctuation\">:<\/span> <span class=\"token string-literal\"><span class=\"token string\">\"The percentage a course is complete\"<\/span><\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">self<\/span><span class=\"token punctuation\">.<\/span>enrollment<span class=\"token punctuation\">.<\/span>percentComplete<span class=\"token punctuation\">)<\/span>\n    <span class=\"token punctuation\">}<\/span>\n    \n    <span class=\"token keyword\">var<\/span> progress<span class=\"token punctuation\">:<\/span> <span class=\"token class-name\">CGFloat<\/span> <span class=\"token punctuation\">{<\/span>\n        <span class=\"token keyword\">return<\/span> <span class=\"token class-name\">CGFloat<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">self<\/span><span class=\"token punctuation\">.<\/span>enrollment<span class=\"token punctuation\">.<\/span>percentComplete<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">\/<\/span> <span class=\"token number\">100<\/span>\n    <span class=\"token punctuation\">}<\/span>\n    \n    <span class=\"token keyword\">var<\/span> imageUrl<span class=\"token punctuation\">:<\/span> <span class=\"token constant\">URL<\/span><span class=\"token operator\">?<\/span> <span class=\"token punctuation\">{<\/span>\n        <span class=\"token keyword\">return<\/span> <span class=\"token keyword\">self<\/span><span class=\"token punctuation\">.<\/span>course<span class=\"token punctuation\">.<\/span>imageUrl\n    <span class=\"token punctuation\">}<\/span>\n\n<span class=\"token punctuation\">}<\/span><\/code><\/pre>\n<\/div>\n<p>Using this <code class=\"language-text\">ViewData<\/code> object is just as simple as it was before. On our home screen, we now create the struct, and configure our custom view with it. Same as before, just leveraging how lightweight creating types in Swift is!<\/p>\n<div class=\"gatsby-highlight\" data-language=\"swift\">\n<pre class=\"language-swift\"><code class=\"language-swift\"><span class=\"token keyword\">func<\/span> <span class=\"token function-definition function\">tableView<\/span><span class=\"token punctuation\">(<\/span><span class=\"token omit keyword\">_<\/span> tableView<span class=\"token punctuation\">:<\/span> <span class=\"token class-name\">UITableView<\/span><span class=\"token punctuation\">,<\/span> cellForRowAt indexPath<span class=\"token punctuation\">:<\/span> <span class=\"token class-name\">IndexPath<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">-&gt;<\/span> <span class=\"token class-name\">UITableViewCell<\/span> <span class=\"token punctuation\">{<\/span>\n    <span class=\"token keyword\">guard<\/span> <span class=\"token keyword\">let<\/span> currentUser <span class=\"token operator\">=<\/span> <span class=\"token keyword\">self<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">userAtIndexPath<\/span><span class=\"token punctuation\">(<\/span>indexPath<span class=\"token punctuation\">:<\/span> indexPath<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">self<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">hasCoursesAtIndexPath<\/span><span class=\"token punctuation\">(<\/span>indexPath<span class=\"token punctuation\">:<\/span> indexPath<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">else<\/span> <span class=\"token punctuation\">{<\/span> <span class=\"token function\">fatalError<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string-literal\"><span class=\"token string\">\"Ruh roh\"<\/span><\/span><span class=\"token operator\">!<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">}<\/span>\n    \n    <span class=\"token keyword\">let<\/span> currentCourse <span class=\"token operator\">=<\/span> currentUser<span class=\"token punctuation\">.<\/span>courses<span class=\"token punctuation\">[<\/span>indexPath<span class=\"token punctuation\">.<\/span>row<span class=\"token punctuation\">]<\/span>\n    <span class=\"token keyword\">let<\/span> currentEnrollment <span class=\"token operator\">=<\/span> currentUser<span class=\"token punctuation\">.<\/span>enrollments<span class=\"token punctuation\">[<\/span>indexPath<span class=\"token punctuation\">.<\/span>row<span class=\"token punctuation\">]<\/span>\n    <span class=\"token keyword\">let<\/span> schoolCustomization <span class=\"token operator\">=<\/span> currentUser<span class=\"token punctuation\">.<\/span>school<span class=\"token punctuation\">.<\/span>customization\n    \n    <span class=\"token keyword\">let<\/span> homeScreenDisplay <span class=\"token operator\">=<\/span> <span class=\"token class-name\">HomeScreenCourseProgressViewDisplay<\/span><span class=\"token punctuation\">(<\/span>\n        course<span class=\"token punctuation\">:<\/span> currentCourse<span class=\"token punctuation\">,<\/span> \n        enrollment<span class=\"token punctuation\">:<\/span> currentEnrollment<span class=\"token punctuation\">,<\/span> \n        customization<span class=\"token punctuation\">:<\/span> schoolCustomization\n    <span class=\"token punctuation\">)<\/span>\n    \n    cell<span class=\"token punctuation\">.<\/span>customView<span class=\"token punctuation\">.<\/span><span class=\"token function\">configure<\/span><span class=\"token punctuation\">(<\/span>viewData<span class=\"token punctuation\">:<\/span> homeScreenDisplay<span class=\"token punctuation\">)<\/span>\n    \n    <span class=\"token keyword\">return<\/span> cell\n<span class=\"token punctuation\">}<\/span><\/code><\/pre>\n<\/div>\n<h4 id=\"2-how-does-the-viewdata-pattern-deal-with-user-interaction\" style=\"position:relative;\"><a href=\"https:\/\/fabisevi.ch\/2019\/12\/26\/building-better-views-part-ii\/#2-how-does-the-viewdata-pattern-deal-with-user-interaction\" aria-label=\"2 how does the viewdata pattern deal with user interaction permalink\" class=\"anchor before\"><svg class=\"header-link\" aria-hidden=\"true\" height=\"24\" version=\"1.1\" viewbox=\"0.5 -2 16 16\" width=\"24\"><path fill=\"currentColor\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"><\/path><\/svg><\/a>2. How does the <code class=\"language-text\">ViewData<\/code> pattern deal with user interaction?<\/h4>\n<p>I advise keeping user actions in the <code class=\"language-text\">UIView<\/code> realm. You can continue using the delegate pattern, closures, or wherever your preferences may lie. If you\u2019re looking to get a little more advanced, I\u2019d consider reading Dave DeLong\u2019s <a href=\"https:\/\/davedelong.com\/blog\/2017\/11\/06\/a-better-mvc-part-1-the-problems\/\">A Better MVC<\/a> series.<\/p>\n<h4 id=\"3-where-does-logic-code-reside-and-what-happens-if-you-have-more-complex-transformations\" style=\"position:relative;\"><a href=\"https:\/\/fabisevi.ch\/2019\/12\/26\/building-better-views-part-ii\/#3-where-does-logic-code-reside-and-what-happens-if-you-have-more-complex-transformations\" aria-label=\"3 where does logic code reside and what happens if you have more complex transformations permalink\" class=\"anchor before\"><svg class=\"header-link\" aria-hidden=\"true\" height=\"24\" version=\"1.1\" viewbox=\"0.5 -2 16 16\" width=\"24\"><path fill=\"currentColor\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"><\/path><\/svg><\/a>3. Where does logic code reside, and what happens if you have more complex transformations?<\/h4>\n<p>The scenarios so far have worked great. The models you received from the server looked a lot like the way you plan to display them, but that&#8217;s not always the case. Sometimes you&#8217;re going to need business logic, and that&#8217;s ok.<\/p>\n<p>This is the question I had the most trouble coming up with one answer for. I realized the reason I couldn&#8217;t come up with one answer is because there isn&#8217;t only one answer.<\/p>\n<p>Looking back at our <code class=\"language-text\">Comment<\/code> model, we see that there is a <code class=\"language-text\">Date<\/code> object in there.<\/p>\n<div class=\"gatsby-highlight\" data-language=\"swift\">\n<pre class=\"language-swift\"><code class=\"language-swift\"><span class=\"token keyword\">public<\/span> <span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">Comment<\/span> <span class=\"token punctuation\">{<\/span>\n    <span class=\"token keyword\">let<\/span> text<span class=\"token punctuation\">:<\/span> <span class=\"token class-name\">String<\/span>\n    <span class=\"token keyword\">let<\/span> commenter<span class=\"token punctuation\">:<\/span> <span class=\"token class-name\">String<\/span>\n    <span class=\"token keyword\">let<\/span> createdAt<span class=\"token punctuation\">:<\/span> <span class=\"token class-name\">Date<\/span>\n    <span class=\"token keyword\">let<\/span> imageUrl<span class=\"token punctuation\">:<\/span> <span class=\"token constant\">URL<\/span><span class=\"token operator\">?<\/span>\n<span class=\"token punctuation\">}<\/span><\/code><\/pre>\n<\/div>\n<p>In our first example we simply glossed over the fact that we were translating a <code class=\"language-text\">Date<\/code> into a <code class=\"language-text\">String<\/code>, by using a simple function that already exists in a third party library.<\/p>\n<div class=\"gatsby-highlight\" data-language=\"swift\">\n<pre class=\"language-swift\"><code class=\"language-swift\"><span class=\"token keyword\">extension<\/span> <span class=\"token class-name\">Comment<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token class-name\">CommentViewData<\/span> <span class=\"token punctuation\">{<\/span>\n    <span class=\"token keyword\">var<\/span> timestamp<span class=\"token punctuation\">:<\/span> <span class=\"token class-name\">String<\/span> <span class=\"token punctuation\">{<\/span>\n        <span class=\"token keyword\">return<\/span> <span class=\"token keyword\">self<\/span><span class=\"token punctuation\">.<\/span>createdAt<span class=\"token punctuation\">.<\/span>timeAgoSinceNow\n    <span class=\"token punctuation\">}<\/span>\n<span class=\"token punctuation\">}<\/span><\/code><\/pre>\n<\/div>\n<p>But now let&#8217;s pretend we don&#8217;t have <code class=\"language-text\">timeAgoSinceNow<\/code> available to us. Where does that transformation code live? The answer is, it&#8217;s up to you!<\/p>\n<p>Some people prefer to make an object to handle business logic, to make their code more testable. If it makes you happy to keep it in the <code class=\"language-text\">ViewData<\/code> file, go right ahead. If not, then don&#8217;t. Who am I to tell people how to be happy?<\/p>\n<div class=\"gatsby-highlight\" data-language=\"swift\">\n<pre class=\"language-swift\"><code class=\"language-swift\"><span class=\"token keyword\">extension<\/span> <span class=\"token class-name\">Comment<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token class-name\">CommentViewData<\/span> <span class=\"token punctuation\">{<\/span>\n\n    <span class=\"token keyword\">var<\/span> timestamp<span class=\"token punctuation\">:<\/span> <span class=\"token class-name\">String<\/span> <span class=\"token punctuation\">{<\/span>\n        <span class=\"token keyword\">let<\/span> dateTransformer <span class=\"token operator\">=<\/span> <span class=\"token class-name\">DateTransformer<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">self<\/span><span class=\"token punctuation\">.<\/span>createdAt<span class=\"token punctuation\">)<\/span>\n        <span class=\"token keyword\">return<\/span> dateTransformer<span class=\"token punctuation\">.<\/span><span class=\"token function\">asString<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>\n    <span class=\"token punctuation\">}<\/span>\n    \n    <span class=\"token keyword\">private<\/span> <span class=\"token keyword\">static<\/span> <span class=\"token keyword\">func<\/span> <span class=\"token function-definition function\">transformDateToString<\/span><span class=\"token punctuation\">(<\/span>date<span class=\"token punctuation\">:<\/span> <span class=\"token class-name\">Date<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">-&gt;<\/span> <span class=\"token class-name\">String<\/span> <span class=\"token punctuation\">{<\/span>\n        <span class=\"token keyword\">return<\/span> <span class=\"token function\">someMagicalWayToTransformDatesToStrings<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>\n    <span class=\"token punctuation\">}<\/span>\n\n<span class=\"token punctuation\">}<\/span>\n    \n<span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">DateTransformer<\/span> <span class=\"token punctuation\">{<\/span>\n    <span class=\"token keyword\">let<\/span> date<span class=\"token punctuation\">:<\/span> <span class=\"token class-name\">Date<\/span>\n\n    <span class=\"token keyword\">func<\/span> <span class=\"token function-definition function\">asString<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">-&gt;<\/span> <span class=\"token class-name\">Date<\/span> <span class=\"token punctuation\">{<\/span>\n        <span class=\"token keyword\">return<\/span> <span class=\"token function\">someMagicalDateTransformer<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>\n    <span class=\"token punctuation\">}<\/span>\n<span class=\"token punctuation\">}<\/span><\/code><\/pre>\n<\/div>\n<p>My personal preference is to use private static functions, keeping in tune with the functional nature of this approach.<\/p>\n<div class=\"gatsby-highlight\" data-language=\"swift\">\n<pre class=\"language-swift\"><code class=\"language-swift\"><span class=\"token keyword\">extension<\/span> <span class=\"token class-name\">Comment<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token class-name\">CommentViewData<\/span> <span class=\"token punctuation\">{<\/span>\n\n    <span class=\"token keyword\">var<\/span> timestamp<span class=\"token punctuation\">:<\/span> <span class=\"token class-name\">String<\/span> <span class=\"token punctuation\">{<\/span>\n        <span class=\"token keyword\">return<\/span> <span class=\"token function\">transformDateToString<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">self<\/span><span class=\"token punctuation\">.<\/span>createdAt<span class=\"token punctuation\">)<\/span>\n    <span class=\"token punctuation\">}<\/span>\n\n<span class=\"token punctuation\">}<\/span>\n\n<span class=\"token keyword\">private<\/span> <span class=\"token keyword\">extension<\/span> <span class=\"token class-name\">Comment<\/span> <span class=\"token punctuation\">{<\/span>\n\n    <span class=\"token keyword\">static<\/span> <span class=\"token keyword\">func<\/span> <span class=\"token function-definition function\">transformDateToString<\/span><span class=\"token punctuation\">(<\/span>date<span class=\"token punctuation\">:<\/span> <span class=\"token class-name\">Date<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">-&gt;<\/span> <span class=\"token class-name\">String<\/span> <span class=\"token punctuation\">{<\/span>\n        <span class=\"token keyword\">return<\/span> <span class=\"token function\">someMagicalDateTransformer<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>\n    <span class=\"token punctuation\">}<\/span>\n\n<span class=\"token punctuation\">}<\/span><\/code><\/pre>\n<\/div>\n<p>The important thing to note is that when it comes to business logic, you have the agency to structure your codebase however you&#8217;d like. The <code class=\"language-text\">ViewData<\/code> pattern isn&#8217;t prohibitive or prescriptive, it&#8217;s just there to aid you in transforming models into views.<\/p>\n<hr>\n<p>These are the big questions I&#8217;ve received while using this pattern over the last few years. I&#8217;m excited to hear your thoughts, and am always receptive to <a href=\"https:\/\/twitter.com\/mergesort\">feedback<\/a>!<\/p>\n<\/div>\n<div class=\"pvc_clear\"><\/div>\n<p id=\"pvc_stats_10545\" class=\"pvc_stats total_only  \" data-element-id=\"10545\" style=\"\"><i class=\"pvc-stats-icon large\" aria-hidden=\"true\"><svg aria-hidden=\"true\" focusable=\"false\" data-prefix=\"far\" data-icon=\"chart-bar\" role=\"img\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 512 512\" class=\"svg-inline--fa fa-chart-bar fa-w-16 fa-2x\"><path fill=\"currentColor\" d=\"M396.8 352h22.4c6.4 0 12.8-6.4 12.8-12.8V108.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v230.4c0 6.4 6.4 12.8 12.8 12.8zm-192 0h22.4c6.4 0 12.8-6.4 12.8-12.8V140.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v198.4c0 6.4 6.4 12.8 12.8 12.8zm96 0h22.4c6.4 0 12.8-6.4 12.8-12.8V204.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v134.4c0 6.4 6.4 12.8 12.8 12.8zM496 400H48V80c0-8.84-7.16-16-16-16H16C7.16 64 0 71.16 0 80v336c0 17.67 14.33 32 32 32h464c8.84 0 16-7.16 16-16v-16c0-8.84-7.16-16-16-16zm-387.2-48h22.4c6.4 0 12.8-6.4 12.8-12.8v-70.4c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v70.4c0 6.4 6.4 12.8 12.8 12.8z\" class=\"\"><\/path><\/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>\n<div id=\"dev95-4209961296\" class=\"dev95-after-content dev95-entity-placement\" role=\"region\" aria-label=\"\u0627\u0644\u0625\u0639\u0644\u0627\u0646\u0627\u062a\"><p style=\"text-align: center;\"><strong>Finally, a link that actually works for your region and device! \ud83c\udf0d Get instant access to the top exclusive offers tailored just for you right now. Don&#8217;t miss out, click here! \ud83d\udc47<\/strong><br data-sfc-root=\"ep\" data-sfc-pl=\"|||[]\" data-complete=\"true\" data-copy-service-computed-style=\"font-family: Arial, sans-serif, &quot;Noto Color Emoji&quot;; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);\" \/><a href=\"https:\/\/www.profitableratecpmnetwork.com\/uzeja8ahze?key=bc876be53d6ad0ff6370ab8ea030e479\"><strong>\ud83d\udd17 [Click here]<\/strong><\/a><\/p>\n<\/div>","protected":false},"excerpt":{"rendered":"<p>If you haven&#8217;t checked out Part I, I recommend reading it because if you don&#8217;t, none of writing below will make sense! Three Unanswered Questions 1. What happens when the views you want to configure are more complex? My recommended<\/p>\n<div class=\"hosteria-entry-more\"><a href=\"https:\/\/dev95.site\/ar\/building-better-views-part-ii-next-steps\/\" 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_10545\" class=\"pvc_stats total_only\" data-element-id=\"10545\" style=\"\"><i class=\"pvc-stats-icon large\" aria-hidden=\"true\"><svg aria-hidden=\"true\" focusable=\"false\" data-prefix=\"far\" data-icon=\"chart-bar\" role=\"img\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewbox=\"0 0 512 512\" class=\"svg-inline--fa fa-chart-bar fa-w-16 fa-2x\"><path fill=\"currentColor\" d=\"M396.8 352h22.4c6.4 0 12.8-6.4 12.8-12.8V108.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v230.4c0 6.4 6.4 12.8 12.8 12.8zm-192 0h22.4c6.4 0 12.8-6.4 12.8-12.8V140.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v198.4c0 6.4 6.4 12.8 12.8 12.8zm96 0h22.4c6.4 0 12.8-6.4 12.8-12.8V204.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v134.4c0 6.4 6.4 12.8 12.8 12.8zM496 400H48V80c0-8.84-7.16-16-16-16H16C7.16 64 0 71.16 0 80v336c0 17.67 14.33 32 32 32h464c8.84 0 16-7.16 16-16v-16c0-8.84-7.16-16-16-16zm-387.2-48h22.4c6.4 0 12.8-6.4 12.8-12.8v-70.4c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v70.4c0 6.4 6.4 12.8 12.8 12.8z\" class=\"\"><\/path><\/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-10545","post","type-post","status-publish","format-standard","hentry","category-posts"],"a3_pvc":{"activated":true,"total_views":5,"today_views":0},"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.7 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Building Better Views (Part II), Next Steps - 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\/building-better-views-part-ii-next-steps\/\" \/>\n<meta property=\"og:locale\" content=\"ar_AR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Building Better Views (Part II), Next Steps - Dev95\" \/>\n<meta property=\"og:description\" content=\"If you haven&#8217;t checked out Part I, I recommend reading it because if you don&#8217;t, none of writing below will make sense! Three Unanswered Questions 1. What happens when the views you want to configure are more complex? My recommendedRead more &gt;&gt;&gt;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/dev95.site\/ar\/building-better-views-part-ii-next-steps\/\" \/>\n<meta property=\"og:site_name\" content=\"Dev95\" \/>\n<meta property=\"article:published_time\" content=\"2019-12-26T00:00:00+00:00\" \/>\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=\"3 \u062f\u0642\u0627\u0626\u0642\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/dev95.site\\\/building-better-views-part-ii-next-steps\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/dev95.site\\\/building-better-views-part-ii-next-steps\\\/\"},\"author\":{\"name\":\"dev95\",\"@id\":\"https:\\\/\\\/dev95.site\\\/#\\\/schema\\\/person\\\/b807805ffe2916206b04d0938bce0298\"},\"headline\":\"Building Better Views (Part II), Next Steps\",\"datePublished\":\"2019-12-26T00:00:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/dev95.site\\\/building-better-views-part-ii-next-steps\\\/\"},\"wordCount\":485,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/dev95.site\\\/#organization\"},\"articleSection\":[\"Posts\"],\"inLanguage\":\"ar\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/dev95.site\\\/building-better-views-part-ii-next-steps\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/dev95.site\\\/building-better-views-part-ii-next-steps\\\/\",\"url\":\"https:\\\/\\\/dev95.site\\\/building-better-views-part-ii-next-steps\\\/\",\"name\":\"Building Better Views (Part II), Next Steps - Dev95\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/dev95.site\\\/#website\"},\"datePublished\":\"2019-12-26T00:00:00+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/dev95.site\\\/building-better-views-part-ii-next-steps\\\/#breadcrumb\"},\"inLanguage\":\"ar\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/dev95.site\\\/building-better-views-part-ii-next-steps\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/dev95.site\\\/building-better-views-part-ii-next-steps\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/dev95.site\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Building Better Views (Part II), Next Steps\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/dev95.site\\\/#website\",\"url\":\"https:\\\/\\\/dev95.site\\\/\",\"name\":\"Dev95\",\"description\":\"Your comprehensive digital platform for knowledge, services, tools, and entertainment.\",\"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":"Building Better Views (Part II), Next Steps - 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\/building-better-views-part-ii-next-steps\/","og_locale":"ar_AR","og_type":"article","og_title":"Building Better Views (Part II), Next Steps - Dev95","og_description":"If you haven&#8217;t checked out Part I, I recommend reading it because if you don&#8217;t, none of writing below will make sense! Three Unanswered Questions 1. What happens when the views you want to configure are more complex? My recommendedRead more &gt;&gt;&gt;","og_url":"https:\/\/dev95.site\/ar\/building-better-views-part-ii-next-steps\/","og_site_name":"Dev95","article_published_time":"2019-12-26T00:00:00+00:00","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":"3 \u062f\u0642\u0627\u0626\u0642"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/dev95.site\/building-better-views-part-ii-next-steps\/#article","isPartOf":{"@id":"https:\/\/dev95.site\/building-better-views-part-ii-next-steps\/"},"author":{"name":"dev95","@id":"https:\/\/dev95.site\/#\/schema\/person\/b807805ffe2916206b04d0938bce0298"},"headline":"Building Better Views (Part II), Next Steps","datePublished":"2019-12-26T00:00:00+00:00","mainEntityOfPage":{"@id":"https:\/\/dev95.site\/building-better-views-part-ii-next-steps\/"},"wordCount":485,"commentCount":0,"publisher":{"@id":"https:\/\/dev95.site\/#organization"},"articleSection":["Posts"],"inLanguage":"ar","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/dev95.site\/building-better-views-part-ii-next-steps\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/dev95.site\/building-better-views-part-ii-next-steps\/","url":"https:\/\/dev95.site\/building-better-views-part-ii-next-steps\/","name":"Building Better Views (Part II), Next Steps - Dev95","isPartOf":{"@id":"https:\/\/dev95.site\/#website"},"datePublished":"2019-12-26T00:00:00+00:00","breadcrumb":{"@id":"https:\/\/dev95.site\/building-better-views-part-ii-next-steps\/#breadcrumb"},"inLanguage":"ar","potentialAction":[{"@type":"ReadAction","target":["https:\/\/dev95.site\/building-better-views-part-ii-next-steps\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/dev95.site\/building-better-views-part-ii-next-steps\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/dev95.site\/"},{"@type":"ListItem","position":2,"name":"Building Better Views (Part II), Next Steps"}]},{"@type":"WebSite","@id":"https:\/\/dev95.site\/#website","url":"https:\/\/dev95.site\/","name":"Dev95","description":"\u0645\u0646\u0635\u062a\u0643 \u0627\u0644\u0631\u0642\u0645\u064a\u0629 \u0627\u0644\u0634\u0627\u0645\u0644\u0629 \u0644\u0644\u0645\u0639\u0631\u0641\u0629 \u0648\u0627\u0644\u062e\u062f\u0645\u0627\u062a \u0648\u0627\u0644\u0623\u062f\u0648\u0627\u062a \u0648\u0627\u0644\u062a\u0631\u0641\u064a\u0647.","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\/10545","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=10545"}],"version-history":[{"count":0,"href":"https:\/\/dev95.site\/ar\/wp-json\/wp\/v2\/posts\/10545\/revisions"}],"wp:attachment":[{"href":"https:\/\/dev95.site\/ar\/wp-json\/wp\/v2\/media?parent=10545"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dev95.site\/ar\/wp-json\/wp\/v2\/categories?post=10545"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dev95.site\/ar\/wp-json\/wp\/v2\/tags?post=10545"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}