Tag: Swift 4

在iOS视图控制器之间发送数据

您是否要在视图控制器之间传递数据? 您已经知道如何连接动作和插座吗? 然后马上上来,因为这是您一直在寻找的简洁,直接的文章。 尽管有几种传递数据的方法,但以下是一个很好的起点。 转发数据 认识Viewcontrollers Fred和Barney。 要将信息从Fred传送到Barney,我们将从以下简单设置开始: 在情节提要中 ,创建一个从Fred到Barney的表演节目,其标识符为sendForward 。 在fred.swift中,使用以下代码为“发送”按钮创建一个动作: @IBAction func sendButtonPressed(_ sender:UIButton){ performSegue(withIdentifier:“ sendForward”,发送者:self) } 3.在其下,添加prepare(for:sender :)方法。 当您调用performSegue时,此方法会自动触发,并完全按照其说明执行—准备segue: 覆盖func prepare(用于segue:UIStoryboardSegue,发件人:任意?){ 如果segue.identifier ==“ sendForward” {// A 如果让destinationVC = segue.destination为? 巴尼{// B destinationVC.data = textField1.text // C } } } 答:您可能有几个问题,因此请首先检查您使用的是正确的问题。 B)为了将信息传递给Barney,我们需要引用他的视图控制器。 C)现在我们已经引用了Barney,可以使用它来引用他的属性。 在这里,我们使用他的data属性,接下来将创建它。 4.在Barney.swift中添加以下属性: var资料:字串? 5.最后: 如果dataReceived = data { dataLabel.text = […]

堆数据结构实现— Swift 4

动机 这篇文章旨在帮助您了解堆数据结构并在Swift中实现它。 在进入实现部分之前,必须先具备swift和heap知识。 什么是堆 堆是一种完整的二叉树的特殊类型,它的父节点与其子节点进行比较,从而为您提供数据结构中的最大值或最小值。 通常有两种类型。 最大堆:在最大堆中,父节点将始终大于其子节点。 所有其他节点可以按任何顺序排列 最小堆:在最小堆中,父节点将始终小于其子节点。 所有其他节点可以按任何顺序排列 。 注意: 当您只关心最小值或最大值时,堆数据结构很有用。 所有其他值将是无序且无排序的。 优先级队列是可以使用堆数据结构的典型示例。 实作 现在,我们将实现具有所有功能的最小堆。 实现需要执行以下步骤: 1.向堆添加值 2.从堆中删除最少的元素 3.从堆中获取最少的元素 我们开工吧。 创建堆类 堆可以用数组表示。 一个父节点可以有一个左子节点和一个右子节点。 我们可以通过以下方式获取正确的Child的索引和离开的孩子的索引 左儿童索引= 2 *父索引+1 右子索引= 2 *父索引+2 用同样的方式 ParentIndex =(childIndex-1)/ 2 在堆类中实现所需的方法 将这些方法添加到堆类中。 现在,我们将添加在Heap上执行自定义操作的方法。 添加这些方法 peek()返回堆中的最小元素 poll()与peek一样,但是它也删除了最小元素 add()将元素添加到堆中 removeMin()删除堆中的最小元素 现在您一定在想,什么是heapifyDown()和heapifyUp() 让我们实现它们 堆砌 这是在将元素添加到列表之后发生的过程。 因此,如果要在堆中添加元素,只需将其添加到最后一个元素,然后开始与父元素进行比较,直到堆满足条件为止 HeapifyDown 当您删除列表中的最小元素并且堆必须重新排列自身以满足条件时,就会发生此过程。 对于父节点,它将检查子节点是否小于父节点(如果是),然后交换该值。 它一直持续到堆满足其先决条件为止。 让我们添加printMethod来打印堆 让我们使用这些方法来处理堆。 […]

Swift 4:填充UITextField和UITextView

扩展检查角半径,边框颜色和阴影 这是与填充无关的其他部分。 如果您不需要了解此主题,只需跳至步骤2。 1. UITextField填充 第5行:更改为您喜欢的任何填充。 第12、16、21行:将textRect,placeholderRect,editingRect覆盖为已实现的填充。 2. UITextView填充 第4行:将textContainerInset设置为所需的UIEdgeInsets。 快来玩Swift! 随时问任何问题🙂

Swift 4中的可编码NSManagedObject(核心数据)和CLLocation

在进入主题之前,让我们先讨论一下编码。 可编码 CODE是Swift 4的新功能。它是Decodable协议的类型别名 和可编码协议。 typealias可编码=可分解和可编码 可以反序列化Decodable符合的枚举/结构/类。 例如,将json对象反序列化为结构。 // 宣言 struct Person:可分解{ 命名:字符串 } //反序列化 让jsonString =“”“ { “名称”:“郑正祥” } “” 如果让jsonData = jsonString.data(使用:.utf8){ 让人=尝试? JSONDecoder()。decode(Person.self,来自:jsonData) } Encodable遵循的 enum / struct / class可以序列化。 例如,一个结构被序列化为一个json对象。 // 宣言 结构人:可编码{ 命名:字符串 } //序列化 let person = Person(姓名:“郑正祥”) 让jsonData =试试吗? JSONEncoder()。encode(person) 上面的示例非常简单,但是显示了2个要点 。 如果自定义类型的所有属性都是可编码的,则它是可编码的。 字符串,整数,双精度型, 数据和URL是内置的可编码类型,因此Person是可编码的。 让我们看一个反例。 结构资产{ let属性:Int […]

掌握CoreData(第16部分,多线程并发策略父级-子级用例2)

使用亲子策略放弃临时更改 在本部分中,我们将看到如何使用“父—子托管对象上下文”策略对UI临时更改核心数据对象。 首先下载启动项目。 注意:有关父级-子托管对象上下文策略,请参见第14和15部分。 当应用程序首次启动时,您将重定向到User屏幕,如图1所示。点击details按钮将执行两项任务。 首先,它将增加登录尝试(实体)计数器,然后将您重定向到“用户详细信息”屏幕,在该屏幕上将显示用户完整信息,用户可以在该屏幕中编辑信息,如图2所示。 图2是“用户详细信息”屏幕,用户可以在其中编辑其信息。 在背面,它移至上一个屏幕(用户屏幕),并放弃临时更改。 点击保存按钮将更新对核心数据的更改 项目结构 描述临时变更问题的项目结构如图3所示。 AppDelegate →负责创建核心数据堆栈。 ViewController→包含显示用户的逻辑,用户可以点击详细信息按钮以重定向到用户详细信息屏幕。 (用户画面) UserDetailViewController→包含用于显示来自Core Data的用户详细信息的逻辑以及用于在用户编辑信息后点击保存按钮时将更改保存到数据库的逻辑 TemporaryChanges.xcdatamodeld→包含两个实体 用户→包含属性firstname , lastName和id LoginAttempt→包含属性计数 问题 首次启动应用程序时,具有firstname和lastname用户(如果不存在)将保存到持久性存储中,并且其f firstname将显示在标签上,如图4所示。 现在,当您点击详细信息按钮时,它将执行两项任务 它将LoginAttempt count属性增加到+1,并通过调用save方法将其保存到持久性存储中 使用情节提要segue重定向到详细信息屏幕 现在点击“用户”屏幕上的“ 详细信息”按钮,它将重定向到用户详细信息屏幕,如图6所示。在此屏幕中,显示了用户详细信息。 用户可以通过单击保存按钮来更新其信息并将其保存到数据库中,也可以通过单击后退按钮放弃其临时更改。 更改用户详细信息,如图7所示,我们将firstname从Ali更改为Ali temp并且还更新了lastname 当用户在任何文本字段上键入内容时,它将更新NSMangedObject类型的User核心数据对象,该对象是控制器的实例属性。 现在,当用户完成firstname文本字段时,此更新也将反映到位于上下文中的user对象 众所周知, User对象是在主线程上下文中填充的,当我们执行临时更改时,它将在上下文中更新该对象,并且当我们点击后退按钮时,更新的值仍然存在于上下文中。 现在,点击后退按钮后,将出现用户屏幕。 我们知道,当我们点击详细信息按钮时,它将首先增加计数器并通过调用save方法来调用save方法,这还将把用户临时更改也推送到永久存储,并使用更新后的值重定向到User Detail屏幕。 由于受管对象上下文是单例对象save方法,因此会将临时更改推送到持久性存储 正如您在更新的屏幕中看到的那样,显示用户临时更改。 问题是,当用户执行后退按钮时,我们需要放弃更改。 我们可以通过三种方式做到这一点 使用父级—子级策略(此部分的封面) 撤消经理(下一部分) 手动跟踪更改(不会涵盖) 使用流程图了解问题 如您在图11中看到的,当应用程序首次启动时,用户信息将存储到持久性存储中。 当您点击详细信息按钮时,它将显示直接与UI交互的主要上下文中的用户详细信息 现在,用户在用于填充“用户详细信息”屏幕的直接coredata实体上编辑信息并更新其信息。 那时,由于User Detail使用核心数据用户对象(主要上下文中)填充其视图。 这种变化也将反映到上下文中。 […]

Swift 4:桥接可编码,JSON和[String:Any]

如果您像大多数Swift开发人员一样,您会欣喜若狂,我们最终对如何在Swift中处理JSON有了明确的答案。 Codable实际上为您免费提供了自定义数据结构的序列化/反序列化。 它开箱即用地支持JSON和Plist,并且它易于扩展的体系结构意味着在接下来的几个月中,我们将在GitHub上看到很多其他选择-我在为您提供YAML。 但是,尽管Swift需要花一些时间为我们提供标准,但社区的其他成员仍然必须与基于JSON的API进行交互。 这导致了各种各样的库和策略。 在大多数情况下, Codable现在提供了这些其他解决方案的批发替代品。 进行切换应尽量避免麻烦,并减少代码行和依赖性。 那是双赢。 想要让我们通过处理JSON序列化/反序列化来提供更多帮助的库的情况有点令人h目结舌。 PubNub是这种方法的一个示例。 这些库希望与Any (通常表示[String: Any]或[Any] )进行交互。 我敢肯定,随着时间的Codable ,这些库中的大部分将包含Codable ,但是现在应该如何与它们集成? Codable为我们提供了一种将自定义对象映射到Data ,因此,如果我们有一种将Data映射到[String: Any]或[Any]那么我们就可以了! 幸运的是, JSONSerialization做到这一点。 因此,一个简单的解决方案是使用JSONSerializtion进行额外的编码/解码,以生成这些库期望的数据类型。 对JSONEcoder和JSONDecoder的扩展很自然地放置了此逻辑,因为您仍然可以访问诸如dateEncodingStrategy类的dateEncodingStrategy 。 结果看起来像这样: 尽管这种方法肯定不会获得任何效率方面的奖励,但它为我们现在需要与之交互的API和光荣的Codable未来之间架起了一座简单的桥梁。

服务器端Swift — MVC

我是全栈开发人员。 我的大多数服务器端应用程序都是用.NET(ASP.NET Web API,ASP.NET MVC)编写的。 但是我在副项目Vcoin上花了最后几个星期。 这是用Swift编写的非常简单的iOS应用程序。 我认为花点时间弄清楚如何在Swift中创建服务器端应用程序将是很棒的。 我已经阅读了一些很棒的文章和对该主题的介绍。 您可以在下面找到其中一些: 顶级服务器端Swift框架与Node.js的基准测试 编辑10月7日:结帐我的后续活动:Linux基准(Ubuntu) medium.com 顶级服务器端Swift框架的当前功能和优势 尽管Server-Side Swift在我眼中已经可以投入生产了,但我知道很难识别从哪里开始或…… medium.com 服务器端Swift框架比较 Swift已经问世了一段时间,它正在成为越来越有吸引力的解决方案,不仅适用于移动设备,而且还适用于… www.netguru.co 阅读这些文章后,我决定选择速度快且功能丰富的Perfect。 但是,在任何地方都找不到如何在Swift / Perfect中构建服务器端生产应用程序的示例。 如何将应用程序划分为某些层。 在哪里放置业务逻辑,验证,模型,数据访问等。因此,我根据对ASP.NET Core MVC的经验,决定构建一些简单的应用程序。 在本文中,我将重点介绍MVC模式。 在接下来的文章中,我将介绍数据访问(使用一些ORM框架),验证,授权等。 MVC的基本思想是通过控制器和视图从用户界面中分离内部数据模型。 服务器端API中的MVC模式: 模式 -应将实体保留在数据库中 提示 -API中的这一层不太明显,没有向用户呈现的具有视图的HTML / Storyboard文件,但是用户会看到其他东西-由我们的API(控制器)生成的JSON,对我而言,JSON是View层 控制器-与业务逻辑一起使用,当然,拥有轻巧的控制器并将真实的业务逻辑转移到比控制器(如服务)更可重用的组件上将是很棒的。 我的模型很简单。 我有两个类,用于存储有关任务和用户的信息。 现在,当我想添加一个新控制器时,我将不得不使用控制器实现创建一个新的Swift文件,并在DependencyContainer扩展中在容器中注册一个新控制器,并将其添加到resolveAllControllers方法的列表中。 当Swift将为自省引入更广泛的方法时,应该删除第二步。 Github仓库和源代码(分支: mvc-pattern ): mczachurski / TaskServerSwift TaskServerSwift –演示项目,其中包含用Swift编写的服务器端代码。 github.com

SwiftSpringBoard:实现iOS主屏幕布局

SwiftSpringBoard是一个旨在重现iOS主屏幕图标配置和功能的项目。 对SwiftSwiftBoard的需求来自我们的一位客户,该客户在其iOS应用程序的主屏幕上使用集合视图。 该客户愿意提供Apple风格的主页按钮重新排序功能以及隐藏单元格的功能。 我们需要一个能够完成以下功能的组件: 以与在iOS主屏幕上显示应用程序相同的方式呈现项目 在屏幕的一个或多个页面上对元素进行重新排序(通过拖放) 从屏幕上删除元素 我们要做的第一件事当然是查找可以满足我们需求的可用框架。 如果您自己这样做,您可能会得出与我们相同的结论:首先,很少有框架与我们的目标相关,其次,截至2017年11月,大多数可用工具尚未得到更新。至少两年。 我们的库依赖于4种类型的对象: SpringBoardView:显示主屏幕样式项的视图(UICollectionView的子类) SpringBoardManager:实现视图行为核心逻辑的对象 SpringBoardDataSource:应用程序用来设置组件的协议 SpringBoardLayout:视图使用的自定义布局(UICollectionViewFlowLayout的子类) 为了最大程度地减少麻烦和不必要的重新实现(并最大程度地了解世界各地的知识),SwiftSpringBoard组件主要使用UICollectionViews中的标准行为:自iOS 9.0起,UICollectionViews本身就可以提供适合基本功能的重新排序机制需要。 此外,自iOS 2.0起,UIScrollViews即可使用分页。 这些功能结合在一起,为我们满足需求提供了坚实的起点。 我们设计了SpringBoardDataSource协议,以便经典UICollectionView机制的用户不会迷路。 首先,用户必须设置其跳板将在单个页面上使用的列数和行数。 为此,用户必须实现以下方法: 对于水平滚动,将逐列加载项目: 问题是,由于主屏幕中的分页是水平进行的,因此我们必须坚持水平滚动。 但是,正如您所看到的,垂直滚动将项目放置的方式与预期放置首页项目的方式相同。 因此,我们必须以垂直布局的方式自己计算项目位置。 计算项目位置本身意味着要处理项目的创建和删除,否则我们将保留对无用变量的引用,这些变量在使用UIKit的默认组件时肯定会导致崩溃,并且我们不会意识到将新项目添加到视图中,这意味着它们永远不会被显示。 布局还必须处理无法完全填充的页面,这是我们在主屏幕上可以看到的行为。 经过大量故障排除后,我们成功处理了布局及其几次更新。 但是组件的部分逻辑仍必须由用户处理,因为他是唯一可以完全访问加载在弹簧板上的原始数据的用户。 假设您的跳板数据由存储在一个名为dataContent的主数组中的数字数组组成 。 您对SpringBoardDataSource的实现应如下所示: 到目前为止,我们打算改进SwiftSpringBoard的几种方法包括: 动态列和行计数:这将是我们的下一个发展。 从今天起,用户必须手动设置其行数和列数以用于布局以正确计算尺寸。 我们希望仅基于布局的插图和间距属性以及项目的固定大小来自动计算行数和列数。 处理文件夹:尽管用户已经可以实现此行为,但我们正在寻找一种干净简单的方法将此功能添加到我们的库中。 一种选择是为打开的文件夹创建SpringBoardView的另一个实例。 如果您碰巧使用了我们的组件,我们真的会对您将如何使用它感到好奇。 如果您有任何问题/建议,请随时与我们联系。 Wassa是室内定位和计算机视觉领域的创新数字代理专家。 无论您是想帮助客户在建筑物中找到自己的出路,增强产品的用户体验,收集有关客户的数据还是分析某个地点的人流量和行为,我们的创新实验室都将科学的专业知识带给您最大的设计灵感根据您的目标调整解决方案。 在 – 找到我们: Facebook和Twitter 领英 的GitHub 我们的网站

使用Swift Codable进行无痛JSON解析

最近,JSON已成为最广泛使用的格式,可以在整个Internet上传输数据。 在iOS开发领域,开发人员通常会在Swift中使用JSON数据并将其用于构建iOS应用。 有一些很酷的库,例如SwiftyJSON已经可以在Swift中使用JSON数据了,这些库之所以流行,是因为开发人员不需要使用JSONSerialization处理不可读的混乱来解析JSON。 幸运的是,Swift 4作为Foundation框架的一部分引入了令人惊叹的Codable协议,并且JSON解析成为一行或两行代码。 这是Apple完全支持的解决方案,可以轻松采用。 它提供了定制功能,可以对复杂的场景进行编码和解码。 在本文中,我们将通过构建Github Information应用程序来了解如何使用Swift 4 Codable解析JSON。 在WWDC 2017上,Apple引入了Swift中的新功能,可以使用Swift Codable协议轻松解析JSON。 有关Foundation的新增功能,可以观看谈话,您可以从23分钟开始观看此新功能。 基本上,此协议具有Encodable和Decodable协议的组合,可用于双向使用JSON数据。 总而言之,Swift Codable协议为我们提供了以下内容。 使用Codable,我们可以通过编写很少的代码行将JSONObject或PropertyList文件建模为等效的Struct或Classs。 我们不必为对象中的属性编写构造函数。 全部由Codable处理。 我们只需要扩展我们的模型以符合Codable,Decodable或Encodable协议即可。 Swift的强数据类型与JSON的丢失数据类型之间的不匹配已由Swift编译器内部处理。 现在,我们可以处理Swift Data类型,例如Date,URL,Float等 复杂的JSON可以使用嵌套结构轻松建模,以提高可读性。 使用JSONDecoder解析实际JSON成为一线人 已经有许多关于该主题的文章,涵盖了Codable协议的端到端介绍。 但是在这篇简短的文章中,我们将使用GitHub API并构建一个示例应用程序来简要演示此功能。 我们将使用非常著名的GitHub API来演示此功能。 我们将构建一个简单的应用程序,该应用程序使用GitHub用户名,并在单击“显示”按钮时显示一些信息。 有一个API可显示GitHub用户的公共信息,例如,我可以使用此API端点找到GitHub帐户的详细信息 https://api.github.com/users/shashikant86 这将以JSON格式返回信息,该信息目前看起来像这样。 { “登录”:“ Shashikant86”, “ id”:683799, “ avatar_url”:“ https://avatars0.githubusercontent.com/u/683799?v=4”, “ gravatar_id”:“”, “ url”:“ https://api.github.com/users/Shashikant86”, “ html_url”:“ https://github.com/Shashikant86”, “ followers_url”:“ https://api.github.com/users/Shashikant86/followers”, […]

Swift 4中的桥接模式

桥接模式将抽象与其实现分离开来,以便两者可以独立变化。 当我第一次学到这个时,桥接模式使我非常高兴。 当您不知道确切的业务逻辑要实现时,但是由于项目的截止日期而需要丰富抽象时,它确实可以为您提供帮助。 当业务逻辑来自客户需求时,仅需对业务逻辑进行编码。 类型:结构图案 也称为:手柄/主体 结构体: 参加者: 抽象:定义抽象的接口。 维护对类型为Implementor的对象的引用。 RefinedAbstraction:扩展Abstraction定义的接口。 实现者:定义实现类的接口。 该接口不必与Abstraction的接口完全对应。 实际上,这两个接口可以完全不同。 通常,Implementor接口仅提供原语操作,而Abstraction基于这些原语定义更高级别的操作。 ConcreteImplementor:实现Implementor接口并定义其具体实现。 Swift 4实现: 让我们考虑客户的要求是绘制Circle和Rectangle,但是我们仍然不知道如何实现实际绘制这些图形的代码。 在实际情况下,可能由于缺乏几何知识或我们选择绘制哪个数字的第三方图书馆而发生。 那些不知道桥接模式的人将等到完成实际的图形实现后,这可能会延迟开发。 如果在这种情况下遵循Bridge Pattern ,则无需等待实现细节,只需创建我们的抽象类并在整个项目中使用该类即可。 一切都会清楚,让我们继续前进。 抽象基础类。 实施此基类,我们可以扩展抽象并制作将在项目其他部分中使用的具体类。 在下面的示例中, Shape是基础抽象类,而Circle和Rectangle是我们抽象的具体类。 注意draw()方法,实际上该图不是绘制而是与该类的其他类调用方法链接在一起的。 在这里, GraphicsAPI是称为“实现者”的类。 抽象类调用实现者类的方法,这是Bridge模式的关键部分。 在上面的代码中,编写了所有抽象类。 现在,需要根据业务逻辑/实现选择来实现实现者类。 桥接模式的用法精彩。 桥接模式适合于实现的运行时绑定。 根据我们的示例,您可能会注意到我们有2个具体的实现类。 您可以在运行时选择任何一个。 例如,您可以在运行时使用DirectXAPI / OpenGLAPI绘制“圆形”和“矩形”。 在此处找到完整的源代码:Github