Tag: 应用程序开发

CocoaTouch:框架和边界

用户界面是应用程序开发中最重要的部分之一。 我们的工作是创造出色的用户体验,以与其他应用程序脱颖而出。 但是,让我们先深入基础知识。 对于UI组件,我们必须考虑两件事: 我的元素有多大? 应该放在哪里? 我的元素有多大? 您必须考虑UI元素的宽度和高度 。 Core Graphics为该用例提供了一个结构。 CGSize结构{ CGFloat宽度; CGFloat高度; }; 应该放在哪里? UI元素使用坐标系定位。 这开始于(在iOS中)屏幕的左上角。 用CGPoint结构指定位置。 CGPoint结构体{ CGFloat x; CGFloat y; }; 两者在一起 现在我们有了大小和位置。 两者结合形成一个“矩形”。 还有一个同时包含信息的结构,称为CGRect 。 struct CGRect { CGPoint起源; CGSize大小; }; 仔细研究源代码,我们将看到矩形是一个包含已知结构(CGSize和CGPoint)的结构 。 帧 让我们创建一个新的UIView。 将矩形(大小和位置)指定为CGRect并将其作为参数传递给构造函数。 let rect = CGRect(x: 70, y: 70, width: 160, height: 100) let myView = […]

应用开发简介

有一个应用程序 关于成为一名程序员,我比其他任何人都被问到的问题是“嘿,兄弟,我想学习制作应用程序,我应该从哪里开始?”或其他形式的变化。 一旦有人开始学习某种语言或希望开始学习某种语言,那么可能出现的第一件事就是我如何使用已经获得/将要获得的编程技能来创建可以向人们展示的应用程序。 这个问题的问题在于它太模糊了。 自苹果发布首款iPhone并带来“应用程序”概念以来,已经过去了将近10年,该应用程序可以部署在可在操作系统上运行的“应用程序商店”上。 在整个应用程序革命之前,操作系统上运行的所有内容通常都被称为软件或应用程序。 而且它不像应用程序开发那么出色。 随着智能手机及其操作系统(如Android和iOS)的疯狂成功,您开发的应用程序将在全球数十亿拥有智能手机和互联网连接的人的手中。 通过应用商店,您可以为应用设定价格,或者使用应用内购买或仅需几行代码就可以包含在应用中的广告,使这些应用获利也变得非常容易。 这意味着成为“应用程序开发人员”实际上是一种可行的职业,可以为您提供稳定的收入来源。 随着越来越多的新程序员加入到越来越多的应用程序开发人员队伍中,应用程序已经从完成了计算器或气象应用程序之类的小型应用程序,发展成为令人难以置信的复杂软件,可以完成从叫车到打车的所有工作。您可以与您的朋友联系,打电话给您的家人到世界一半的地方,甚至可以监控您的健康状况并帮助找到治疗癌症的方法。 这意味着整个应用程序生态系统还刺激了对其他相关业务(如服务器后端,数据存储解决方案和IDE的实际编码)的需求。 这是苹果公司针对iPhone的广告,其中大量的应用程序是他们的主要卖点 因此,现在回到如何制作应用程序这一主题,您将需要做出许多决定: 我正在开发什么样的应用程序? 会是游戏吗? 还是可以帮助人们更有效地完成工作的工具? 还是它将成为人们的交流平台? 我要在哪个平台上分发它? 将用于网络吗? 还是用于移动设备? 如果用于移动设备,则使用哪个平台,Android,iOS或Windows Phone? 会是跨平台的吗? 我擅长什么语言,我需要学习什么语言? 我是否具有为要构建的平台编程所需的硬件和软件? 在找到上述问题的答案之后,您将有良好的基础开始在该应用程序上进行实际工作。 现在,所有应用程序的构建方式都不相同,每个类别的工作流程略有不同。 让我来看看其中的一些。 我通过学习HTML,CSS和javascript开始编程。 这些语言是现代网络的基础,对于开始编程的人来说,它们是非常好的“网关语言”。 这是因为所有这些语言的入门门槛都非常低,可以容忍初学者程序员犯的常见错误,并且它们是一些最受欢迎的编程语言,因此在互联网上无处不在。 诸如堆栈溢出之类的网站上充斥着有关这些语言的信息,您真正面临的问题很可能已经由堆栈溢出的真正有用的社区解决,您所需要知道的只是外观。 现在,按照他们的传统常识,没有人会认为这些语言中的任何一种都是您用于应用程序开发的语言,但是您会感到惊讶。 Web应用程序或在浏览器中运行的应用程序仅使用这些语言编写,现在甚至可以在Node.js的帮助下使用JavaScript编写后端服务。 这些应用程序既可以托管在您的服务器上(例如web.whatsapp.com或inbox.google.com),也可以使用Chrome网络应用商店打包和部署,这些应用程序使chrome浏览器的用户即使在离线状态下也可以使用该应用程序, chrome图书(我听说你很窃笑,但chromebook的销量仅次于macbook,并且由于其极低的价格而增长很快)是它们唯一的应用程序来源。 您还可以使用phonegap / Xamarin / Titanium mobile等服务在移动设备上分发基于Web的应用程序。 这绝对不适用于所有类型的应用程序,因为网络应用程序的性能受到严重限制,它们的本机功能也是如此,例如对指纹读取器,蓝牙和其他网络功能的正确访问。 以下是您可能需要在此处开始的一些事项: 一个好的文本编辑器: 很多人可能只对终端上的VIM或emacs甚至记事本感到满意。 但是许多其他文本编辑器为表带来了很多好处,例如代码突出显示,代码建议,自动完成,花括号完成等。 我会推荐的一些非常好的工具是Notepad ++,Adobe Brackets,Sublime和Github Atom。 最后,文本编辑器的选择完全由您决定,您应该选择最适合自己的一种。 节点程序包管理器(NPM): 在下载软件包及其依赖项时,这是一个非常宝贵的工具,在为您的项目下载工具和库时,它将真正为您提供帮助。 […]

苹果增强现实的下一步:ARKit 1.5更新

Umbrella Web在我们的App开发人员博客上发布了一篇新的博客文章,名为Apple的增强现实的下一步:ARKit 1.5更新 从库比蒂诺(Cupertino)春暖花开,到AR狂热者的喜悦:新的iOS 11.3发布,并带来了ARKit 1.5。 它提供什么? Umbrella Web团队已准备好使用此更新的AR开发工具来分享他们的经验。 伞不仅对有前途的尖端技术充满热情,而且对每次更新和更新都始终如一。 该团队不习惯于半途而废,致力于与客户和久经考验的工具建立长期关系。 使用ARKit开发应用程序在很大程度上得益于以下事实:许多工具和解决方案并非绝对是新的,而是可以重新用于当前的软件解决方案。 换句话说,尽管场景的背景是摄像机的视频流,但是在处理3D模型,灯光和动画时,许多事情与SceneKit框架中的事情相似。 这使大多数增强现实应用程序开发人员(尤其是游戏开发人员)可以快速学习新技术,甚至可以利用以前使用的模型,纹理和动画,从而使他们能够在ARKit通过Beta-测试时及时创建新的启发性项目。版本状态。 通过处理其中一个应用程序,Umbrella团队亲身体验了ARKit的主要优势:快速,正确地检测表面。 例如,应用程序功能之一旨在使用虚拟卷尺测量表面,但这些平面仅限于水平。 现在,由于1.5更新,该功能可以进行改进以测量垂直方向。 ARKit于2017年9月19日发布,在开始的头六个月中,其全球安装的AR应用已经价值1300万。 根据SensorTower的统计,在这段时间内,非基于AR的免费游戏中最热门的应用一直是IKEA Place。 在2018年3月,它们在全球的下载量达到20万。 此外,3月,IKEA Place也可用于Android设备。 此外,还添加了可视搜索功能,该功能允许在公司库存中搜索您喜欢的家具。 这意味着宜家AR应用程序可以达到预期的效果,并且公司的目标是朝着这个方向前进。 该经验可以称为成功通过的大规模现场验证。 这些是迄今为止ARKit使用的结果,但是Umbrella建议超越并展望最近的未来。 预计AR应用程序的开发将为您带来新的呼吸。 Apple人机界面指南已经根据ARKit 1.5提供的新功能和机遇进行了更新。 垂直添加 其中最明显的是检测垂直平面和水平面。 桌子,椅子和地板已经在发挥作用,现在AR应用程序也可以使用墙壁和窗户。 开发人员似乎非常热衷于将虚拟球弹向他们的计算机屏幕或在墙壁上打通虚拟隧道。 让我们考虑一下最初的情况以及迈向大规模工业和商业用途的次要但强有力的步骤。 这是在伞办公室周围移动的太阳黄色圆点。 可以清楚地看到,该系统不仅可以检测到地板,还可以检测到墙壁以及墙壁海报等物体。 以前,它仅在水平表面上工作。 https://www.appfutura.com/uploads/blog/2018/05/dffe07bf084448e5e27ae73ed5a050d01527588048.gif 更多新功能 改进的不规则形状曲面的映射。 随着ARKit现在允许映射(例如,圆表),AR场景的整体体验变得越来越现实。 检测2D真实对象并将其集成到增强现实中。 简而言之,您将iPhone指向海报,艺术品或照片等图像即可互动。 算法是这样的:该应用程序检测到标记并向您显示相关的3D内容。 分辨率 (从720p变为1080p)和自动对焦功能提高了50% 。 由于与以前的版本相比,真实的对象看起来更鲜明,更清晰,因此这些场景更加真实。 通过应用程序拍摄的照片在图像质量方面将与iPhone照片相似。 在遮阳伞的办公室里带一些安迪·沃霍尔(Andy Warhol)的虚拟风格(使用Artsy应用程序)。 想知道半年前Umbrella第一次体验ARKit吗? 看起来有些不同,不是吗? 在AppFutura上查找更多全球顶级移动应用开发公司。

2017年最佳新应用程序

适用于iOS和Android的应用程序市场充满了数百万个应用程序,并且每天都在增加。 Pocketgamer.biz报告说,开发人员每天向iOS的App Store提交1000多个应用程序。 由于竞争激烈,这对于开发人员而言似乎是个坏消息,但对于智能手机用户而言绝对是个好消息。 有更多的选择和机会来改善他们的应用程序体验,尤其是顶级应用程序。 也就是说,筛选许多应用程序以找到满足特定需求的作品可能会令人生畏。 今天,我们将重点介绍2017年最佳的新应用程序。我们在许多类别中选择了10种出色的产品。 超级马里奥跑 有史以来最成功的游戏之一终于进入了iOS平台。 苹果公司在2016年发布了它,它充满了期待和兴奋。 该应用程序已于2016年12月底开始在iOS上使用,但实际上直到2017年初才开始吸引人。目前,该游戏在Android上的发布仍在继续。 Android用户只能注册加入游戏的预定列表,并在游戏发布时立即获得游戏-日期尚未确定。 该游戏可以免费下载,但可以通过应用程序购买。 挡泥板音调 挡泥板以生产高质量乐器而闻名。 因此,当公司的第一个数字业务是吉他调音应用程序时就不足为奇了。 也就是说,自去年年中以来一直在iOS上运行的应用最近已在Android上启动。 该应用程序是完全免费的,顾名思义,它提供了一个易于使用的应用程序,可以使吉他恢复原声,无论是原声,电还是低音。 除了调音外,该应用程序还为初学者提供有关调音,弹奏和放大器设置的提示。 我们对此感到兴奋的原因之一是该应用程序的潜力,例如通过蓝牙将应用程序与即将推出的放大器进行同步。 HomeSpotter房地产 顾名思义,HomeSpotter是用于房屋狩猎的应用程序。 这是一个允许房屋猎人和不同类型的探员之间进行协作的应用程序。 该应用程序几乎可以描述为不动产。 这意味着客户基本上可以完成整个房屋狩猎过程,而不必离开自己的舒适环境。 客户可以实时查看代理并与他们聊天。 代理可以直接交换照片,而客户可以依次在同一窗口中查看同一照片。 该界面易于浏览,使用户之间的发短信更方便。 此外,用户一次可以与多个人聊天。 奥拓的奥德赛 奥拓的奥德赛是雪人开发的非常成功的游戏《奥拓历险记》的续集。 自2015年发行以来,Alto’s Adventure被众多评论评为“有史以来最伟大的手机游戏”。 虽然新游戏保持了相同的感觉和游戏玩法,但从预告片来看,似乎发生了一件重要的事情-沙漠风光取代了积雪,而不是大雪。 自12月以来,开发人员一直在围绕新发行版进行热烈讨论,其短语为:“下一次冒险等待”。该游戏的发行版计划于2017年夏季发布。目前还不确定该游戏是否会在Android上发行。和iOS平台同时使用。 要了解更多信息,请访问我们的博客。

委派指南-Swift 4

现实世界中的代表团 一个很好的起点是通过解释现实世界中的授权。 在现实世界中,委托封装了某人(委托人)将任务(委托人)交给其他人(委托人)。 有两个名词和一个动词组成委派: 委托(动词):“将任务或责任委托给另一个人”。 委托人(名词):“委托他人的人”。 代表(名词):“被选择或当选代表他人的人”。 为了澄清-委托人(名词)会将责任(动词)委托给委托人(名词)。 现在我们有了组成委派的组件的字典定义,接下来让我们实际展示一个真实的委派示例: 在仓库中,将有一名物流经理( 代理人 ),他们将知道卡车何时到达以及何时到达。 物流经理很忙,虽然他们很擅长管理物流,但在装卸和搬运箱子时却不那么擅长。 因此,他们将这项工作( 代表–动词 )交给仓库操作员( 代表–名词 )。 后勤经理告诉仓库操作员,一辆卡车将在09.00到达,当到达09.00时,他们告诉仓库操作员该卡车已经到达。 然后,仓库操作员卸下货车并将箱子运到需要的地方。 iOS世界中的代表团 数字世界中的委派与现实世界中的委派非常相似,不同之处在于,我们拥有的不是对象而不是人,而对象在Swift中将是类,结构或枚举的实例。 让我们以对现实世界相同的方式来分解软件开发中的委托: 委托(动词):将任务或责任委托给另一个对象。 委托人(名词):将职责“移交给”另一种类型的实例(对象)的类或结构实例(对象)。 委托(名词):保证处理已委派职责的对象,即提供委派的功能。 需要澄清的是,委托是指一个对象(代理)代表另一个对象(代理)提供功能时的行为。 现在,让我们通过从参与对象的角度来考虑委派来进一步深入研究: 您创建一个待办事项列表应用程序。 您可以将UIViewController子类化,以创建名为“ ToDoListViewController ”( 委托–名词 )的视图控制器对象。 您将一个UITableView实例( 委托人 )放在ToDoListViewController 。 UITableView会显示要执行的项目并检测与之交互的时间,但会将处理这些交互( 委托–动词 )的责任移交给另一个对象。 UITableView实例( delegator )将向事件的委托对象通知其将要处理或刚刚处理的事件。 ToDoListViewController ( 委托人–名词 )声明它将提供响应UITableView处理的事件而发生的功能。 假设UITableView实例( delegator )可以讲话,该对象可能会说:“ 我是一个表视图对象,并且选择了第3行 ”。 “ ToDoListViewController […]

iOS面试问题第5部分:核心数据📗

是时候挖掘核心数据了。 如果您错过了上一个第4部分:UIKit,请检查一下。 现在开始吧!!! 📀 问:持久性存储协调器可以有多个持久性存储吗? 持久性存储协调器将持久性对象存储和托管对象模型相关联 ,并向托管对象上下文提供外观,以使一组持久性存储显示为单个聚合存储。 它具有对托管对象模型的引用,该对象模型描述了商店中或其管理的商店中的实体。 在许多应用程序中,您只有一个商店,但是在复杂的应用程序中,可能有多个商店,每个商店可能包含不同的实体。 问:为什么我们需要多个持久性存储? 应用程序具有固定数据集,该数据集已包含在捆绑软件中 应用程序处理的某些数据是我们不希望保留在磁盘上的敏感信息 对不同实体有不同的存储要求 您可能已通过将文件包中的文件复制到可写位置并将其用作整个数据存储库的方式来满足第一个要求。 您可能已经通过手动删除对象来处理第二个问题。 在两种情况下,单独的持久性存储都是更好的解决方案。 每个持久性存储都有自己的特征-可以是只读的,可以二进制或SQLite或内存形式存储(在OS X上,也可以使用XML后备存储),也可以是您自己的NSIncrementalStore实现。 可以将模型的不同部分存储在不同的持久性存储中,以利用这种灵活性。 问:如何添加多个永久存储? 借助托管对象模型中的配置,我们可以实现这一目标。 我们可以创建多个配置并将其分配给不同的持久性存储。 我们希望每个商店一个配置 ,并且每个实体应仅添加到一个配置 (除了默认配置)。 实体可以具有多种配置,但是在这种情况下,您必须手动将每个对象分配给存储。 通过为每个商店创建一个配置并将每个实体分配给一个配置,我们使核心数据框架能够将实体定向到不同的商店,而无需任何进一步的交互。 问:我们可以在不同的持久存储实体之间建立关系吗? 您必须注意不要创建从一个持久性存储中的实例到另一个持久性存储中的实例的关系,因为Core Data不支持这种关系。 如果需要在不同商店中的实体之间创建关系,则通常使用获取的属性。 问:一个持久性存储协调器可以有多少个托管对象模型? 每个模型我们只能有一个持久性存储协调器。 问:持久性存储的类型? 问:持久存储安全性有哪些限制? Apple Docs说:Core Data 不保证不受信任来源(与内部生成的存储相对) 的持久存储的安全性,并且无法检测文件是否已被恶意修改 。 SQLite存储提供的安全性比XML和二进制存储好一些,但是不应将其固有地视为安全的 。 还应注意,元数据中存储的数据可能会独立于存储数据而被篡改。 为确保数据安全,请使用加密磁盘映像之类的技术 。 问:核心数据中的并发类型是什么? 两种并发模式NSMainQueueConcurrencyType和NSPrivateQueueConcurrencyType 。 NSMainQueueConcurrencyType特别用于您的应用程序界面,并且只能在应用程序的主队列上使用。 NSPrivateQueueConcurrencyType配置在初始化时创建自己的队列,并且只能在该队列上使用。 因为该队列是私有的,并且在NSManagedObjectContext实例的内部,所以只能通过performBlock:和performBlockAndWait:方法对其进行访问。 当您使用NSPersistentContainer ,viewContext属性配置为NSMainQueueConcurrencyType上下文,而与performBackgroundTask:和newBackgroundContext关联的上下文配置为NSPrivateQueueConcurrencyType 。 […]

细胞协议铸造

多单元转换可能是使用大型视图控制器的最大原因。 我已经在互联网上进行了广泛的搜索,发现的并不是一个庞大的视图控制器。 我敢肯定我们都看过这样的东西👇👇👇👇👇 不,我不会谈论MVVM。 我们可以做得更好! 第一个解决方案将是Swift 4.2,然后是Swift 4.1 30号线 UserTableViewControler符合CellDelegate 可能不是分配委托的最佳方法。 但这是避免多细胞铸造的关键。 您还可以避免对多个单元格进行检查,从而使tapped()成为可选选项,但是我很累,因此我将让您弄清楚这一点。 1号线 参数类型T提供了更大的灵活性,并避免了针对不同数据类型的多种协议。 由于CaseIterable在swift 4.1上不可用,因此枚举的RawValue类型为Int,标识符变量返回单元格标识符。 而已! 其他一切都保持不变。 在GitHub上下载完整的解决方案。 Swift 4.2 https://github.com/ErickApps/ProtocolCellsSwift4.2 Swift 4.1 https://github.com/ErickApps/ProtocolCellSwift4.1 确保跟随这些家伙 保罗·哈德森 推特:@seanallen_dev 推特:@buildthatapp 雷·温德利希 结论 不是MVVM解决方案🤪 减少键入和调试。 不再施力👇👇👇👇👇👇 批评总是受到欢迎。 在Twitter上让我知道:@ pitjits u

Okta身份验证第1部分

使用Okta,用户可以轻松地将身份验证和授权集成到本机iOS应用程序中。 两种类型的Okta身份验证。 Okta Mobile Connect(SAML) OpenID连接 Okta Mobile Connect为支持SAML(安全性断言标记语言)的本机移动应用程序启用SSO(单一登录)。 SSO(单点登录)的优点: 1.无需输入用户名和密码 2.无需记住和更新密码。 3.没有弱密码。 OpenID Connect扩展了OAuth 2.0协议。 OAuth 2.0通过作用域访问令牌提供API安全性,而OpenID Connect提供用户身份验证和SSO(单点登录)功能。 Okta身份验证API: Okta身份验证API用于通过创建和控制会话令牌来控制对本机应用程序的访问。 会话令牌是身份验证事务成功完成时发出的一次性令牌。 Okta中使用的会话令牌,而访问令牌,刷新令牌和用于访问第三方应用程序(例如您的应用程序)的客户端ID。 OAuth 2.0: OAuth 2.0协议用于以安全的方式授予对您的应用程序数据的授予访问权限。 OAuth 2.0具有以下4个重要角色: 服务器是“授权服务器”,它发出访问令牌。 Okta是授权服务器。 “资源所有者”,通常是应用程序的最终用户,授予使用访问令牌访问资源服务器的权限。 应用程序“客户端”从Okta请求访问令牌,然后将其传递到资源服务器。 “资源服务器”,它接受访问令牌,并且必须验证它是否有效。 资源服务器就是您的应用程序。 OAuth 2.0授权流程的工作方式如下: 客户端向资源所有者(用户)请求授权。 如果用户给予授权,则客户端将授权授予传递给授权服务器(Okta)。 如果授予有效,则授权服务器将返回访问令牌以及刷新令牌和ID令牌。 客户端使用访问令牌来访问资源服务器。 OpenID Connect: OpenID Connect是建立在OAuth 2.0之上的身份验证标准。 它添加了另一个称为ID令牌的令牌。 OpenID Connect的重要角色: “ OpenID提供程序”是颁发ID令牌的授权服务器。 Okta代表OpenID提供者。 “最终用户”,其信息包含在ID令牌中。 “信赖方”,即从Okta请求ID令牌的客户端应用程序。 “ […]

如何在macOS中制作标签

开发应用程序时常见的UI元素是标签。 在iOS和tvOS中,此元素称为UILabel 。 可能令您感到奇怪的一件事是macOS没有这样的对手。 相反,我们需要使用文本字段,更具体地说是NSTextField 。 为了保持传统,我们将两个平台的标签实现简单地比较两个世界。 这里没有什么特别的,我们创建标签,给它一个框架,分配一些虚拟文本,将白色设置为背景色,然后告诉标签调整大小以适合内容。 在生产应用中,通常不调用sizeToFit,除非在手动计算元素大小时需要标签的确切帧大小。 我通常会坚持大多数UI实现的约束。 关于iOS / tvOS的知识已经足够多了,让我们开始讨论一下如何在macOS上完成此工作。 我们首先创建一个NSTextField并设置一个框架。 接下来的事情是将文本添加到我们的标签中, NSTextField不提供类似于UILabel的文本属性。 相反,我们需要将stringValue设置为文本字段; 这与NSTextField的继承有关。 它继承自NSControl , NSControl具有与值相关的一堆属性,例如doubleValue , floatValue , intValue等。在处理从NSControl继承的其他类时,要牢记这一点。 如果要从NSTextField中提取文本值,则可以使用相同的属性来实现。 接下来是设置背景色,如果您还记得有关将背景色应用于NSView的文章 ,您会注意到这与该实现有所不同。 NSTextField具有采用NSColor的backgroundColor属性。 分层方法不适用于NSTextField 。 告诉标签为sizeToFit足以使标签显示在屏幕上,但这不会给我们想要的输出。 您会注意到我们在文本字段周围有一个边框,要摆脱它,我们只需将isBezeled属性设置为false和voila 。 现在看起来像是预期的,但是我们需要做的最后一件事是使它充当标签而不是文本字段,并且将isEditable设置为false。 就是这样,我们已经在macOS上创建了与UILabel等效的东西。

Swift中的JSON(De)Serialization

现在,我已经启动并运行了Node.js服务器,接下来我将继续研究应用程序的客户端。 我必须解决的第一个任务是进行API调用和处理JSON响应。 在本文中,我将引导您完成代码以完成此任务。 第一步是创建可JSONifiable的类。 值得庆幸的是,很多功能是预先内置在swift中的。 在这里,我将使用JSONEncoder和JSONDecoder处理对象的序列化和反序列化。 我添加了两个函数来封装它,encode()可以将一个对象转换为可以传输到服务器的JSON数据,decode()可以将数据转换为Swift对象。 您可以在下面看到如何使用它的示例。 下一部分将使用此Transmittable协议使用JSON主体对服务器进行API调用,并接收和处理响应数据。 这个APICaller类的主要功能是对服务器上的端点执行API调用。 该函数采用一个端点(“ / users”),一个方法(“ POST”),一个请求主体(一个User对象)以及响应类型(User.self)。 它调用createURLRequest()来格式化URLRequest对象。 然后,它使用URLSession调用后端。 接下来,我们检查HTTP响应代码。 除200(或200s之外的其他任何代码)之外的任何代码均表示呼叫成功通过了网络,但是服务器引发了错误。 如果所有检查都通过,我们将反序列化服务器返回的数据并调用完成处理程序。 在上面的示例中,我们使用User对象主体对/ users端点进行POST调用。 在这种情况下,我们还将在服务器的响应中返回User对象。 希望这对您的项目有所帮助。 始终欢迎提出问题,评论和更正。