{"id":1638,"date":"2019-06-05T07:30:34","date_gmt":"2019-06-05T12:30:34","guid":{"rendered":"http:\/\/www.jaimerios.com\/?p=1638"},"modified":"2025-12-03T20:25:45","modified_gmt":"2025-12-03T20:25:45","slug":"making-a-connection-using-swift","status":"publish","type":"post","link":"https:\/\/jaimerios.com\/?p=1638","title":{"rendered":"Making a connection using Swift"},"content":{"rendered":"\n<p><style>\npre.swift {<br \/>\n    font-family: Consolas,Monaco,Lucida Console,Liberation Mono,DejaVu Sans Mono,Bitstream Vera Sans Mono,Courier New, monospace;<br \/>\n    font-size: small;<br \/>\n}<br \/>\n<\/style><\/p>\n\n\n\n<p><strong>Previously<\/strong><\/p>\n\n\n\n<p><a href=\"http:\/\/www.jaimerios.com\/?p=1631\" target=\"_blank\" rel=\"noopener noreferrer\">Part 1, Working with REST<\/a><\/p>\n\n\n\n<p>In the previous article, we installed a local JSON server, to make testing the app we are about to create in this article, fast.<\/p>\n\n\n\n<p>In this article, we are going to create a console app, using Swift. In the following article, we will be doing the same process, using C++.<\/p>\n\n\n\n<p><strong>Creating a console app in Xcode<\/strong><br>Launch Xcode, then create a new project using<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Select &#8220;Create a new Xcode project&#8221; from the &#8220;Welcome to Xcode&#8221; window, OR<\/li>\n\n\n\n<li>File -> New -> Project menu item, OR<\/li>\n\n\n\n<li>\u2318 + Shift + N<\/li>\n<\/ul>\n\n\n\n<p>Select &#8220;Command Line Tool&#8221;<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><img loading=\"lazy\" decoding=\"async\" width=\"744\" height=\"574\" src=\"https:\/\/jaimerios.com\/wp-content\/uploads\/2019\/05\/Xcode_create_console_app.png\" alt=\"\" class=\"wp-image-1641\" srcset=\"https:\/\/jaimerios.com\/wp-content\/uploads\/2019\/05\/Xcode_create_console_app.png 744w, https:\/\/jaimerios.com\/wp-content\/uploads\/2019\/05\/Xcode_create_console_app-300x231.png 300w\" sizes=\"auto, (max-width: 744px) 100vw, 744px\" \/><\/figure>\n<\/div>\n\n\n<p><\/p>\n\n\n\n<p>Enter in the name for your app. You can leave the organization name to the defaults.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><img loading=\"lazy\" decoding=\"async\" width=\"748\" height=\"570\" src=\"https:\/\/jaimerios.com\/wp-content\/uploads\/2019\/05\/Xcode_console_app_step_2.png\" alt=\"\" class=\"wp-image-1640\" srcset=\"https:\/\/jaimerios.com\/wp-content\/uploads\/2019\/05\/Xcode_console_app_step_2.png 748w, https:\/\/jaimerios.com\/wp-content\/uploads\/2019\/05\/Xcode_console_app_step_2-300x229.png 300w\" sizes=\"auto, (max-width: 748px) 100vw, 748px\" \/><\/figure>\n<\/div>\n\n\n<p><\/p>\n\n\n\n<p>We are presented with a basic console app project; the file that you are interested in is main.swift.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><img loading=\"lazy\" decoding=\"async\" width=\"1069\" height=\"440\" src=\"https:\/\/jaimerios.com\/wp-content\/uploads\/2019\/05\/Xcode_initial_project_file.png\" alt=\"\" class=\"wp-image-1642\" srcset=\"https:\/\/jaimerios.com\/wp-content\/uploads\/2019\/05\/Xcode_initial_project_file.png 1069w, https:\/\/jaimerios.com\/wp-content\/uploads\/2019\/05\/Xcode_initial_project_file-300x123.png 300w, https:\/\/jaimerios.com\/wp-content\/uploads\/2019\/05\/Xcode_initial_project_file-1024x421.png 1024w, https:\/\/jaimerios.com\/wp-content\/uploads\/2019\/05\/Xcode_initial_project_file-768x316.png 768w\" sizes=\"auto, (max-width: 1069px) 100vw, 1069px\" \/><\/figure>\n<\/div>\n\n\n<p><\/p>\n\n\n\n<p>With a Swift console app, you don\u2019t need to define a main function, like you would with other languages. Instead, you can just start typing code and the app will execute the commands in the order that they appear.<\/p>\n\n\n\n<p>So, let&#8217;s write up some code.<\/p>\n\n\n\n<p>To connect to the local JSON server, we are going to:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Create a URL, initialized with a string<\/li>\n\n\n\n<li>Initialize a URLRequest with our URL and set the options<\/li>\n\n\n\n<li>Use the shared URLSession to create a dataTask<\/li>\n\n\n\n<li>Create a closure for our dataTask to handle the HTTP response<\/li>\n<\/ul>\n\n\n\n<p>A little explanation of the classes we are using&#8230;<\/p>\n\n\n\n<p>The <strong>URL<\/strong> represents the location of an item, which in this case is a server, and has many functions for handling the path it contains.<\/p>\n\n\n\n<p>The <strong>URLRequest<\/strong> handles the load request to our server.<\/p>\n\n\n\n<p>The <strong>URLSession<\/strong> handles the data transfer from our server.<\/p>\n\n\n\n<p>So, here is what our initial code looks like:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 0 16px;font-size:0.8em;width:100%;text-align:left;background-color:#1E1E1E;font-style:italic;color:#D4D4D4\"><span style=\"border-bottom:1px solid rgba(234, 191, 191, 0.2)\">Swift<\/span><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>import Foundation\n\nlet serverURL = \"http:\/\/localhost:3000\"\n\n\/\/ Function that will attempt to connect to a REST endpoint\nfunc connectToServer() {\n    \n    \/\/ Create a URL from our string path\n    guard let urlPath = URL(string: serverURL) else { print(\"Failure to create a URL path\"); return }\n    \n    \/\/ Set up the request object\n    var request = URLRequest(url: urlPath)\n    request.httpMethod = \"GET\"\n    \n    \/\/ Create a data task that will be processed asynchronously\n    let session = URLSession.shared\n    let task = session.dataTask(with: request)\n}\n\nconnectToServer()\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #C586C0\">import<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">Foundation<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">let<\/span><span style=\"color: #D4D4D4\"> serverURL = <\/span><span style=\"color: #CE9178\">&quot;http:\/\/localhost:3000&quot;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ Function that will attempt to connect to a REST endpoint<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">func<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">connectToServer<\/span><span style=\"color: #D4D4D4\">() {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ Create a URL from our string path<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">guard<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">let<\/span><span style=\"color: #D4D4D4\"> urlPath = <\/span><span style=\"color: #DCDCAA\">URL<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #DCDCAA\">string<\/span><span style=\"color: #D4D4D4\">: serverURL) <\/span><span style=\"color: #C586C0\">else<\/span><span style=\"color: #D4D4D4\"> { <\/span><span style=\"color: #DCDCAA\">print<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;Failure to create a URL path&quot;<\/span><span style=\"color: #D4D4D4\">); <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ Set up the request object<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">var<\/span><span style=\"color: #D4D4D4\"> request = <\/span><span style=\"color: #DCDCAA\">URLRequest<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #DCDCAA\">url<\/span><span style=\"color: #D4D4D4\">: urlPath)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    request.<\/span><span style=\"color: #9CDCFE\">httpMethod<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #CE9178\">&quot;GET&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ Create a data task that will be processed asynchronously<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">let<\/span><span style=\"color: #D4D4D4\"> session = URLSession.<\/span><span style=\"color: #9CDCFE\">shared<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">let<\/span><span style=\"color: #D4D4D4\"> task = session.<\/span><span style=\"color: #DCDCAA\">dataTask<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #DCDCAA\">with<\/span><span style=\"color: #D4D4D4\">: request)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #DCDCAA\">connectToServer<\/span><span style=\"color: #D4D4D4\">()<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p>This code, if you server is running, will connect to our server, but, we will also want to get some data.<\/p>\n\n\n\n<p>We have to let the task know that we want it to do it\u2019s job and put in some code to handle the response from the server.<\/p>\n\n\n\n<p>We will implement that using closures.<\/p>\n\n\n\n<p><strong>Data task<\/strong><br>A Swift closure is the equivalent of a lambda, in C++, a function that is created on the spot and not declared elsewhere.<\/p>\n\n\n\n<p>There are plenty of times where you need code to handle something, like a server response, but the code makes more sense to be close to the originating code and not elsewhere.<\/p>\n\n\n\n<p>You can create another function and pass that to our function as a parameter, but in this example, I\u2019m just going to use a closure.<\/p>\n\n\n\n<p>The dataTask completionHandler is documented at the <a href=\"https:\/\/developer.apple.com\/documentation\/foundation\/urlsession\/1410330-datatask\" target=\"blank\" rel=\"noopener noreferrer\">Apple developer docs<\/a> if you want more details.<\/p>\n\n\n\n<p>Here is the code I created for handling the server response:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 0 16px;font-size:0.8em;width:100%;text-align:left;background-color:#1E1E1E;font-style:italic;color:#D4D4D4\"><span style=\"border-bottom:1px solid rgba(234, 191, 191, 0.2)\">Swift<\/span><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>import Foundation\n\nlet serverURL = \"http:\/\/localhost:3000\"\n\n\/\/ Function that will attempt to connect to a REST endpoint\nfunc connectToServer() {\n    \n    \/\/ Create a URL from our string path\n    guard let urlPath = URL(string: serverURL) else { print(\"Failure to create a URL path\"); return }\n    \n    \/\/ Set up the request object\n    var request = URLRequest(url: urlPath)\n    request.httpMethod = \"GET\"\n    \n    \/\/ Create a data task that will be processed asynchronously\n    let session = URLSession.shared\n    let task = session.dataTask(with: request, completionHandler: {\n        (data, response, error) in\n        \n        \/\/ If we have an error, well, that's a problem\n        guard error == nil else { print(\"Detected error\"); return }\n        \/\/ If we can't get the data, that's a problem too\n        guard let received = data else { print(\"Unable to get data\"); return }\n        \/\/ And, if we can't get the response, we shouldn't proceed\n        guard let httpResponse = response as? HTTPURLResponse else { print(\"Could not get theHTTP response\"); return }\n        \n        \/\/ If we made it to this point, then we are golden\n        print(httpResponse)\n        print(received.description)\n    })\n    \n    \/\/ This is the line that tells the task to start it's job\n    task.resume()\n}\n\nconnectToServer()\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #C586C0\">import<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">Foundation<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">let<\/span><span style=\"color: #D4D4D4\"> serverURL = <\/span><span style=\"color: #CE9178\">&quot;http:\/\/localhost:3000&quot;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ Function that will attempt to connect to a REST endpoint<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">func<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">connectToServer<\/span><span style=\"color: #D4D4D4\">() {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ Create a URL from our string path<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">guard<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">let<\/span><span style=\"color: #D4D4D4\"> urlPath = <\/span><span style=\"color: #DCDCAA\">URL<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #DCDCAA\">string<\/span><span style=\"color: #D4D4D4\">: serverURL) <\/span><span style=\"color: #C586C0\">else<\/span><span style=\"color: #D4D4D4\"> { <\/span><span style=\"color: #DCDCAA\">print<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;Failure to create a URL path&quot;<\/span><span style=\"color: #D4D4D4\">); <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ Set up the request object<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">var<\/span><span style=\"color: #D4D4D4\"> request = <\/span><span style=\"color: #DCDCAA\">URLRequest<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #DCDCAA\">url<\/span><span style=\"color: #D4D4D4\">: urlPath)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    request.<\/span><span style=\"color: #9CDCFE\">httpMethod<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #CE9178\">&quot;GET&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ Create a data task that will be processed asynchronously<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">let<\/span><span style=\"color: #D4D4D4\"> session = URLSession.<\/span><span style=\"color: #9CDCFE\">shared<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">let<\/span><span style=\"color: #D4D4D4\"> task = session.<\/span><span style=\"color: #DCDCAA\">dataTask<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #DCDCAA\">with<\/span><span style=\"color: #D4D4D4\">: request, <\/span><span style=\"color: #DCDCAA\">completionHandler<\/span><span style=\"color: #D4D4D4\">: {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        (data, response, error) <\/span><span style=\"color: #C586C0\">in<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #6A9955\">\/\/ If we have an error, well, that&#39;s a problem<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">guard<\/span><span style=\"color: #D4D4D4\"> error == <\/span><span style=\"color: #569CD6\">nil<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #C586C0\">else<\/span><span style=\"color: #D4D4D4\"> { <\/span><span style=\"color: #DCDCAA\">print<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;Detected error&quot;<\/span><span style=\"color: #D4D4D4\">); <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #6A9955\">\/\/ If we can&#39;t get the data, that&#39;s a problem too<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">guard<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">let<\/span><span style=\"color: #D4D4D4\"> received = data <\/span><span style=\"color: #C586C0\">else<\/span><span style=\"color: #D4D4D4\"> { <\/span><span style=\"color: #DCDCAA\">print<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;Unable to get data&quot;<\/span><span style=\"color: #D4D4D4\">); <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #6A9955\">\/\/ And, if we can&#39;t get the response, we shouldn&#39;t proceed<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">guard<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">let<\/span><span style=\"color: #D4D4D4\"> httpResponse = response as? HTTPURLResponse <\/span><span style=\"color: #C586C0\">else<\/span><span style=\"color: #D4D4D4\"> { <\/span><span style=\"color: #DCDCAA\">print<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;Could not get theHTTP response&quot;<\/span><span style=\"color: #D4D4D4\">); <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #6A9955\">\/\/ If we made it to this point, then we are golden<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #DCDCAA\">print<\/span><span style=\"color: #D4D4D4\">(httpResponse)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #DCDCAA\">print<\/span><span style=\"color: #D4D4D4\">(received.<\/span><span style=\"color: #9CDCFE\">description<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    })<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ This is the line that tells the task to start it&#39;s job<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    task.<\/span><span style=\"color: #DCDCAA\">resume<\/span><span style=\"color: #D4D4D4\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #DCDCAA\">connectToServer<\/span><span style=\"color: #D4D4D4\">()<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p>If you were to run the program right now, you notice that nothing happens.<\/p>\n\n\n\n<p>What gives?<\/p>\n\n\n\n<p>Well, the task is running asynchronously, in the background, and since the code was proceeding along, without any clue that there was a task running in the background, the app just exits.<\/p>\n\n\n\n<p>We are going to create a loop&#8230; a nasty one&#8230; that will keep the program running, while the dataTask runs.<\/p>\n\n\n\n<p>To make the loop stop, we have to have a way of knowing that the task is complete.<\/p>\n\n\n\n<p>So, we will send a completion function, that the dataTask will call, to indicate that the app can quit.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 0 16px;font-size:0.8em;width:100%;text-align:left;background-color:#1E1E1E;font-style:italic;color:#D4D4D4\"><span style=\"border-bottom:1px solid rgba(234, 191, 191, 0.2)\">Swift<\/span><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>import Foundation\n\nlet serverURL = \"http:\/\/localhost:3000\"\nvar processIsDone = false\n\n\/\/ Function that will attempt to connect to a REST endpoint\nfunc connectToServer(callWhenDone: @escaping () -> Void) {\n    \n    \/\/ Create a URL from our string path\n    guard let urlPath = URL(string: serverURL) else { print(\"Failure to create a URL path\"); return }\n    \n    \/\/ Set up the request object\n    var request = URLRequest(url: urlPath)\n    request.httpMethod = \"GET\"\n    \n    \/\/ Create a data task that will be processed asynchronously\n    let session = URLSession.shared\n    let task = session.dataTask(with: request, completionHandler: {\n        data, response, error in\n        \n        \/\/ If we have an error, well, that's a problem\n        guard error == nil else { print(\"Detected error\"); return }\n        \/\/ If we can't get the data, that's a problem too\n        guard let received = data else { print(\"Unable to get data\"); return }\n        \/\/ And, if we can't get the response, we shouldn't proceed\n        guard let httpResponse = response as? HTTPURLResponse else { \n            print(\"Could not get theHTTP response\")\n            return \n        }\n        \n        \/\/ If we made it to this point, then we are golden\n        print(httpResponse)\n        print(received.description)\n        \n        callWhenDone()\n    })\n    \n    \/\/ This is the line that tells the task to start it's job\n    task.resume()\n}\n    \nconnectToServer(callWhenDone: {\n    () in\n    \/\/ The closure that will tell the app that\n    \/\/ it is ready to move on from the loop\n    print(\"Task is done; connectToServer called\")\n    processIsDone = true\n})\n\nvar x = 0\n\n\/\/ The nasty loop, that continues while the bool is true\nwhile processIsDone == false {\n    \/\/ We have to do something, right?\n    x += 1\n}\n\nprint(\"Application will exit now\")\n\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #C586C0\">import<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">Foundation<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">let<\/span><span style=\"color: #D4D4D4\"> serverURL = <\/span><span style=\"color: #CE9178\">&quot;http:\/\/localhost:3000&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">var<\/span><span style=\"color: #D4D4D4\"> processIsDone = <\/span><span style=\"color: #569CD6\">false<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ Function that will attempt to connect to a REST endpoint<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">func<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">connectToServer<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #DCDCAA\">callWhenDone<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #569CD6\">@escaping<\/span><span style=\"color: #D4D4D4\"> () -&gt; <\/span><span style=\"color: #4EC9B0\">Void<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ Create a URL from our string path<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">guard<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">let<\/span><span style=\"color: #D4D4D4\"> urlPath = <\/span><span style=\"color: #DCDCAA\">URL<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #DCDCAA\">string<\/span><span style=\"color: #D4D4D4\">: serverURL) <\/span><span style=\"color: #C586C0\">else<\/span><span style=\"color: #D4D4D4\"> { <\/span><span style=\"color: #DCDCAA\">print<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;Failure to create a URL path&quot;<\/span><span style=\"color: #D4D4D4\">); <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ Set up the request object<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">var<\/span><span style=\"color: #D4D4D4\"> request = <\/span><span style=\"color: #DCDCAA\">URLRequest<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #DCDCAA\">url<\/span><span style=\"color: #D4D4D4\">: urlPath)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    request.<\/span><span style=\"color: #9CDCFE\">httpMethod<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #CE9178\">&quot;GET&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ Create a data task that will be processed asynchronously<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">let<\/span><span style=\"color: #D4D4D4\"> session = URLSession.<\/span><span style=\"color: #9CDCFE\">shared<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">let<\/span><span style=\"color: #D4D4D4\"> task = session.<\/span><span style=\"color: #DCDCAA\">dataTask<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #DCDCAA\">with<\/span><span style=\"color: #D4D4D4\">: request, <\/span><span style=\"color: #DCDCAA\">completionHandler<\/span><span style=\"color: #D4D4D4\">: {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        data, response, error <\/span><span style=\"color: #C586C0\">in<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #6A9955\">\/\/ If we have an error, well, that&#39;s a problem<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">guard<\/span><span style=\"color: #D4D4D4\"> error == <\/span><span style=\"color: #569CD6\">nil<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #C586C0\">else<\/span><span style=\"color: #D4D4D4\"> { <\/span><span style=\"color: #DCDCAA\">print<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;Detected error&quot;<\/span><span style=\"color: #D4D4D4\">); <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #6A9955\">\/\/ If we can&#39;t get the data, that&#39;s a problem too<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">guard<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">let<\/span><span style=\"color: #D4D4D4\"> received = data <\/span><span style=\"color: #C586C0\">else<\/span><span style=\"color: #D4D4D4\"> { <\/span><span style=\"color: #DCDCAA\">print<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;Unable to get data&quot;<\/span><span style=\"color: #D4D4D4\">); <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #6A9955\">\/\/ And, if we can&#39;t get the response, we shouldn&#39;t proceed<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">guard<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">let<\/span><span style=\"color: #D4D4D4\"> httpResponse = response as? HTTPURLResponse <\/span><span style=\"color: #C586C0\">else<\/span><span style=\"color: #D4D4D4\"> { <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #DCDCAA\">print<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;Could not get theHTTP response&quot;<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #6A9955\">\/\/ If we made it to this point, then we are golden<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #DCDCAA\">print<\/span><span style=\"color: #D4D4D4\">(httpResponse)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #DCDCAA\">print<\/span><span style=\"color: #D4D4D4\">(received.<\/span><span style=\"color: #9CDCFE\">description<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #DCDCAA\">callWhenDone<\/span><span style=\"color: #D4D4D4\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    })<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ This is the line that tells the task to start it&#39;s job<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    task.<\/span><span style=\"color: #DCDCAA\">resume<\/span><span style=\"color: #D4D4D4\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #DCDCAA\">connectToServer<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #DCDCAA\">callWhenDone<\/span><span style=\"color: #D4D4D4\">: {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    () <\/span><span style=\"color: #C586C0\">in<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ The closure that will tell the app that<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ it is ready to move on from the loop<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #DCDCAA\">print<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;Task is done; connectToServer called&quot;<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    processIsDone = <\/span><span style=\"color: #569CD6\">true<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">})<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">var<\/span><span style=\"color: #D4D4D4\"> x = <\/span><span style=\"color: #B5CEA8\">0<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ The nasty loop, that continues while the bool is true<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C586C0\">while<\/span><span style=\"color: #D4D4D4\"> processIsDone == <\/span><span style=\"color: #569CD6\">false<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ We have to do something, right?<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    x += <\/span><span style=\"color: #B5CEA8\">1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #DCDCAA\">print<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;Application will exit now&quot;<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p>The Swift code connects to our local JSON server and retrieves the response, printed to the Console in Xcode.<\/p>\n\n\n\n<p><strong>Failures<\/strong><\/p>\n\n\n\n<p>One thing to add, is, if there is an error, the code should have a way of handling that too.<\/p>\n\n\n\n<p>Let&#8217;s add a parameter to the connectToServer function, to call out to when a problem was detected.<\/p>\n\n\n\n<p>To make the parameters in the function look neat, we can use Typealiases.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 0 16px;font-size:0.8em;width:100%;text-align:left;background-color:#1E1E1E;font-style:italic;color:#D4D4D4\"><span style=\"border-bottom:1px solid rgba(234, 191, 191, 0.2)\">Swift<\/span><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>import Foundation\n\n\/\/ The address to our server\nlet serverURL = \"http:\/\/localhost:3000\"\n\/\/ The variable that lets the loop know it is time to stop\nvar processIsDone = false\n\n\/\/ Typealiases to make our function parameters look neater\ntypealias Success = () -> Void\ntypealias Failure = (_ error: Error?) -> Void\n\n\/\/ Function that will attempt to connect to a REST endpoint\nfunc connectToServer(callWhenDone success: @escaping Success, callWhenError failure: Failure?) {\n\n    \/\/ Create a URL from our string path\n    guard let urlPath = URL(string: serverURL) else { print(\"Failure to create a URL path\"); return }\n    \n    \/\/ Set up the request object\n    var request = URLRequest(url: urlPath)\n    request.httpMethod = \"GET\"\n    \n    \/\/ Create a data task that will be processed asynchronously\n    let session = URLSession.shared\n    let task = session.dataTask(with: request, completionHandler: {\n        (data, response, error) in\n        \/\/ A closure to handle the task process\n        \n        \/\/ If we have an error, well, that's a problem\n        guard error == nil else { failure?(error); return }\n        \/\/ If we can't get the data, that's a problem too\n        guard let received = data else { failure?(error); return }\n        \/\/ And, if we can't get the response, we shouldn't proceed\n        guard let httpResponse = response as? HTTPURLResponse else { print(\"Could not get theHTTP response\"); return }\n        \/\/ If we made it to this point, then we are golden\n        print(httpResponse)\n        print(received.description)\n        success()\n    })\n    \/\/ This is the line that tells the task to start it's job\n    task.resume()\n}\n\n\/\/ Call the function, passing in a success and failure closure\nconnectToServer(callWhenDone: {\n    () in\n    \n    \/\/ The closure that will tell the app that\n    \/\/ it is ready to move on from the loop\n    print(\"Task is done; connectToServer called\")\n    processIsDone = true\n}, callWhenError: {\n    ( error ) in\n    \n    \/\/ A closure to handle when an error was detected\n    \n    if let err = error {\n        print(\"Detected error: \\(err.localizedDescription)\")\n    }\n    processIsDone = true\n})\n\n\/\/ Loop to give the asynchronous data task enough time to get\n\/\/ a response from the server\nvar x = 0\nwhile processIsDone == false {\n    \/\/ We have to do something, right?\n    x += 1\n}\n\nprint(\"Application will exit now\")\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #C586C0\">import<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">Foundation<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ The address to our server<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">let<\/span><span style=\"color: #D4D4D4\"> serverURL = <\/span><span style=\"color: #CE9178\">&quot;http:\/\/localhost:3000&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ The variable that lets the loop know it is time to stop<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">var<\/span><span style=\"color: #D4D4D4\"> processIsDone = <\/span><span style=\"color: #569CD6\">false<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ Typealiases to make our function parameters look neater<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">typealias<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">Success<\/span><span style=\"color: #D4D4D4\"> = () -&gt; <\/span><span style=\"color: #4EC9B0\">Void<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">typealias<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">Failure<\/span><span style=\"color: #D4D4D4\"> = (_ error: <\/span><span style=\"color: #4EC9B0\">Error<\/span><span style=\"color: #D4D4D4\">?) -&gt; <\/span><span style=\"color: #4EC9B0\">Void<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ Function that will attempt to connect to a REST endpoint<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">func<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">connectToServer<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #DCDCAA\">callWhenDone<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">success<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #569CD6\">@escaping<\/span><span style=\"color: #D4D4D4\"> Success, <\/span><span style=\"color: #DCDCAA\">callWhenError<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">failure<\/span><span style=\"color: #D4D4D4\">: Failure?) {<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ Create a URL from our string path<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">guard<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">let<\/span><span style=\"color: #D4D4D4\"> urlPath = <\/span><span style=\"color: #DCDCAA\">URL<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #DCDCAA\">string<\/span><span style=\"color: #D4D4D4\">: serverURL) <\/span><span style=\"color: #C586C0\">else<\/span><span style=\"color: #D4D4D4\"> { <\/span><span style=\"color: #DCDCAA\">print<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;Failure to create a URL path&quot;<\/span><span style=\"color: #D4D4D4\">); <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ Set up the request object<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">var<\/span><span style=\"color: #D4D4D4\"> request = <\/span><span style=\"color: #DCDCAA\">URLRequest<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #DCDCAA\">url<\/span><span style=\"color: #D4D4D4\">: urlPath)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    request.<\/span><span style=\"color: #9CDCFE\">httpMethod<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #CE9178\">&quot;GET&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ Create a data task that will be processed asynchronously<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">let<\/span><span style=\"color: #D4D4D4\"> session = URLSession.<\/span><span style=\"color: #9CDCFE\">shared<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">let<\/span><span style=\"color: #D4D4D4\"> task = session.<\/span><span style=\"color: #DCDCAA\">dataTask<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #DCDCAA\">with<\/span><span style=\"color: #D4D4D4\">: request, <\/span><span style=\"color: #DCDCAA\">completionHandler<\/span><span style=\"color: #D4D4D4\">: {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        (data, response, error) <\/span><span style=\"color: #C586C0\">in<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #6A9955\">\/\/ A closure to handle the task process<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #6A9955\">\/\/ If we have an error, well, that&#39;s a problem<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">guard<\/span><span style=\"color: #D4D4D4\"> error == <\/span><span style=\"color: #569CD6\">nil<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #C586C0\">else<\/span><span style=\"color: #D4D4D4\"> { failure?(error); <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #6A9955\">\/\/ If we can&#39;t get the data, that&#39;s a problem too<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">guard<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">let<\/span><span style=\"color: #D4D4D4\"> received = data <\/span><span style=\"color: #C586C0\">else<\/span><span style=\"color: #D4D4D4\"> { failure?(error); <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #6A9955\">\/\/ And, if we can&#39;t get the response, we shouldn&#39;t proceed<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">guard<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">let<\/span><span style=\"color: #D4D4D4\"> httpResponse = response as? HTTPURLResponse <\/span><span style=\"color: #C586C0\">else<\/span><span style=\"color: #D4D4D4\"> { <\/span><span style=\"color: #DCDCAA\">print<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;Could not get theHTTP response&quot;<\/span><span style=\"color: #D4D4D4\">); <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #6A9955\">\/\/ If we made it to this point, then we are golden<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #DCDCAA\">print<\/span><span style=\"color: #D4D4D4\">(httpResponse)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #DCDCAA\">print<\/span><span style=\"color: #D4D4D4\">(received.<\/span><span style=\"color: #9CDCFE\">description<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #DCDCAA\">success<\/span><span style=\"color: #D4D4D4\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    })<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ This is the line that tells the task to start it&#39;s job<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    task.<\/span><span style=\"color: #DCDCAA\">resume<\/span><span style=\"color: #D4D4D4\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ Call the function, passing in a success and failure closure<\/span><\/span>\n<span class=\"line\"><span style=\"color: #DCDCAA\">connectToServer<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #DCDCAA\">callWhenDone<\/span><span style=\"color: #D4D4D4\">: {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    () <\/span><span style=\"color: #C586C0\">in<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ The closure that will tell the app that<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ it is ready to move on from the loop<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #DCDCAA\">print<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;Task is done; connectToServer called&quot;<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    processIsDone = <\/span><span style=\"color: #569CD6\">true<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}, <\/span><span style=\"color: #DCDCAA\">callWhenError<\/span><span style=\"color: #D4D4D4\">: {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    ( error ) <\/span><span style=\"color: #C586C0\">in<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ A closure to handle when an error was detected<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">let<\/span><span style=\"color: #D4D4D4\"> err = error {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #DCDCAA\">print<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;Detected error: <\/span><span style=\"color: #569CD6\">\\(<\/span><span style=\"color: #D4D4D4\">err.<\/span><span style=\"color: #9CDCFE\">localizedDescription<\/span><span style=\"color: #569CD6\">)<\/span><span style=\"color: #CE9178\">&quot;<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    processIsDone = <\/span><span style=\"color: #569CD6\">true<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">})<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ Loop to give the asynchronous data task enough time to get<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ a response from the server<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">var<\/span><span style=\"color: #D4D4D4\"> x = <\/span><span style=\"color: #B5CEA8\">0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C586C0\">while<\/span><span style=\"color: #D4D4D4\"> processIsDone == <\/span><span style=\"color: #569CD6\">false<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ We have to do something, right?<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    x += <\/span><span style=\"color: #B5CEA8\">1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #DCDCAA\">print<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;Application will exit now&quot;<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Now, the function will exit the dataTask gracefully when there is an error and the application won&#8217;t get stuck on the forever running loop.<\/p>\n\n\n\n<p>In the next article, we will be making the same type of connection, using C++.<\/p>\n\n\n\n<p><strong>Index<\/strong><br><br><a href=\"http:\/\/www.jaimerios.com\/?p=1717\" target=\"_blank\" rel=\"noopener noreferrer\">Article Series Index<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Previously Part 1, Working with REST In the previous article, we installed a local JSON server, to make testing the app we are about to create in this article, fast. In this article, we are going to create a console app, using Swift. In the following article, we will be doing the same process, using &#8230; <a title=\"Making a connection using Swift\" class=\"read-more\" href=\"https:\/\/jaimerios.com\/?p=1638\" aria-label=\"Read more about Making a connection using Swift\">Read more<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3,28,33],"tags":[385],"class_list":["post-1638","post","type-post","status-publish","format-standard","hentry","category-coding","category-swift","category-uncategorized","tag-rest"],"_links":{"self":[{"href":"https:\/\/jaimerios.com\/index.php?rest_route=\/wp\/v2\/posts\/1638","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/jaimerios.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/jaimerios.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/jaimerios.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/jaimerios.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1638"}],"version-history":[{"count":1,"href":"https:\/\/jaimerios.com\/index.php?rest_route=\/wp\/v2\/posts\/1638\/revisions"}],"predecessor-version":[{"id":1908,"href":"https:\/\/jaimerios.com\/index.php?rest_route=\/wp\/v2\/posts\/1638\/revisions\/1908"}],"wp:attachment":[{"href":"https:\/\/jaimerios.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1638"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/jaimerios.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1638"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/jaimerios.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1638"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}