Tag: Swift 4

Swift 4.2 Reduce和CoreLocation:总行驶距离🚗

在最近的一个项目中,我遇到了一个非常确定的问题,我敢肯定其他许多开发人员也会遇到:计算列表中存储的位置之间的总距离。 例如,假设您在由CLLocation对象列表表示的地图上有一条自定义路线。 您如何仅从CLLocation对象计算路线的总长度? 其背后的数学很简单,绝对没有理由写一个故事: 总距离等于列表中所有连接的位置对之间的距离之和 。 对于位置[A,B,C,D]的列表,可以表示为: | AD | = | AB | + | BC | + | CD |。 但是,可以使用我们位置对象上提供的函数distance(from :)以不同的方式完成该实现。 样板解决方案: 使用传统的面向对象方法,可以通过几个变量和位置迭代来解决此问题: 样板解决方案 该实现完全按照我们的预期工作,并且对于任何初看它的开发人员来说都是可读性和可理解性。 但是(没有双行中断),对于需要参考下一个/上一个元素以及将在集合迭代期间进行调整的变量的任何给定问题,最有可能重写这9行代码因此命名为样板解决方案)。 递归解决方案: 递归专家将很快意识到这是一个递归问题:我们为递归列表的一部分积累一个临时结果,并使用积累的结果对列表的其余部分执行相同的操作。 这就是为什么递归函数可以帮助我们节省几行样板代码的原因: 递归解决方案 但是仅通过查看递归函数就可以肯定地说,我们获得的一行代码(与样板解决方案相比)不值得在递归调用中引入一致性和简单性的损失-请记住,并非所有开发人员对递归同样感到高兴。 简化的解决方案: 如果我告诉过您所有的样板代码和递归代码都可以限制为一行代码怎么办? 一个纯粹的面向对象的开发人员可能不会相信我,但是实际上,这是可以实现的。 如果考虑我们在做什么,我们将在递归数据结构上应用组合函数(distance(from :)),并以递归方式使用函数的每次应用结果。 这正是函数编程中高阶函数折叠所做的定义¹。 幸运的是,在Swift中,我们有一个类似的功能可以折叠: reduce(_:_:)函数reduce(_:_:) 。 reduce函数将初始结果和闭包作为参数,然后在返回最终结果之前使用闭包组合Sequence的每个元素。 最简单的示例是使用reduce函数对整数列表求和: [2,5,3,10] .reduce(0,+)//返回20 但是,在我们的情况下,我们需要更加具体,因为+函数实际上不适用于CLLocation对象。 相反,我们希望应用distance(from:)函数。 为此,我们还需要引用列表中的上一个(或下一个)元素。 reduce函数不会自动为您提供下一个元素的访问权限(与其他任何迭代一样),因此,为了解决此问题,我们可以使用元组作为初始累加结果,第一个元素是累加距离,第二个元素是累加距离先前的CLLocation对象: (CLLocationDistance, CLLocation?) 。 location元素是可选的,因为在我们提供给reduce函数的初始结果中没有先前的元素。 […]

掌握CoreData(第5部分,核心数据中实体之间的关系)

出于本部分的目的,我们将扩展Todo应用程序。 最终应用将处理一对一和一对多关系。 我们将在后面的部分中讨论“ 多对多” 。 示例项目中有三个实体 1.用户→这将是主要实体,与Task和Passport实体具有关系 2.任务→这将包含用户的Todo任务,与用户具有多对一关系 3.护照→它将包含用户的护照信息,与用户具有一对一关系 这些都是到目前为止创建的所有实体,如图1,2和3所示。如果您不知道如何添加属性,请参阅第3部分。 创建关系时,您需要决定很多事情,这些选项在“ 数据模型”检查器选项卡的右侧,如图4所示。 您想与之建立关系的目标实体 →目标实体名称 基数 →关系是否是一对一,多对一 可选→关系可以为NULL / NOT NULL 瞬态 →内存使用率 限制 →如果是一对多,关系中是否存在最大或最小数量的对象? (下限不必为零) 方向 →大多数对象关系本质上是双向的 。 如果一个部门与一个部门中的员工有“到-许多关系”,则从员工到部门之间存在一对一的反向关系 。 推荐的方法是在两个方向上建模关系,并适当指定逆关系。 如果进行更改,Core Data将使用此信息来确保对象图的一致性 删除规则→关系的删除规则指定如果尝试删除源对象 ,应在目标实体上发生什么。 拒绝 →如果关系目的地(员工)上至少有一个对象,请不要删除源对象(部门)。 Nullify →删除对象之间的关系,但不要删除任何一个对象。 级联 →删除源时,删除关系目标处的对象。 无操作 →对关系目标处的对象不执行任何操作 。 “操作”规则可能没有用,因为如果使用该规则,则有可能使对象图处于不一致状态(员工与已删除部门有关系)。 一对一关系(用户→护照) 现在,我们创建用户与护照的关系。 用户可以拥有与其关联的一本护照。 转到用户实体→在“关系”上单击+,然后单击→添加关系详细信息,如图5所示。 对于逆关系,我们还需要在另一侧创建关系 转到“护照实体”→在“关系”上单击+,然后单击→添加关系详细信息,如图6所示。 现在我们需要确定删除规则。 如果删除了用户,则无需保留用户护照怎么办,因此我们将用户→护照删除规则设置为级联,如图7所示,这意味着在删除用户1时,核心数据会自动删除与用户1相关联的所有护照。 其次,我们选择“ 数据模型”检查器的“类型”点击上的“ […]

Raspberry Pi时间流逝,带有Swift,Vapor,Docker和Nginx的Ubuntu 16.04服务器

为了使这个基本任务复杂化并学到一些有趣的东西,可以使用Docker并在容器中运行我们的服务器。 有很多关于Docker的教程(我建议您查阅https://www.digitalocean.com教程),因此我将只关注与我的项目相关的部分。 我遵循了本教程:https://bygri.github.io/2018/05/14/developing-deploying-vapor-docker.html 因为服务器代码非常简单,所以我没有使用单独的开发/生产设置和docker-compose。 要启动蒸气项目: 蒸发新的上传图像 我从模板中剥离了所有不必要的代码(删除了数据库依赖项),并将route.swift减少为: 进口蒸气 结构图片:内容{ var image:文件 } 公共 功能路由( _路由器:路由器) 抛出 { router.post(“ image”){ req-> Future 在 返回 尝试 req.content.decode(Image.self).map(to:HTTPStatus.self){fileImage in 让 imageFolder =“ / app / Public” 让 fileName = fileImage.image.filename 让 url = URL(fileURLWithPath:imageFolder).appendingPathComponent(fileName) 做 { 尝试 fileImage.image.data.write(to:url) } { 返回 .badRequest } 返回 .ok } } } […]

如何为初学者Swift4在TableViewController上轻松显示数据

我们要建造什么? 我们将建立一个tableview,显示与上图一样的名称。 我们要做的第一件事是打开Xcode,单击新项目,将其命名为您想要的任何名称,然后将我的项目命名为“名称”,然后选择单视图应用程序,然后单击“下一步”,然后单击“创建”并将其保存在所需的任何位置。 接下来,我们将清理我们的项目。 我们将从删除屏幕左侧的ViewController.swift文件开始。 右键单击ViewController.swift文件,然后单击“ 删除” 。 然后单击“ 移至垃圾箱”(不要单击“ 删除引用”) 现在您的项目文件应如下所示 接下来单击Main.storyboard并选择View Controller 然后按键盘上的Delete键,您可能会遇到一个小错误,当您按Delete键时,它不会删除View Controller,只需选择另一个文件,然后再次选择Main.storyboard,现在它应该可以工作了。 现在,我们将拖放一个TableViewController。 如果仍然有一个符号说ViewController,那么您要做的就是选择另一个文件,然后重新选择Main.storyboard以摆脱该符号。 如果您现在运行该应用程序(要运行,请单击左上角的播放按钮)。 屏幕将变为黑色,因为您的应用现在已经知道从哪里开始运行。 告诉应用您要从哪里开始。 单击TableViewController并选择属性检查器。 然后选择是初始视图控制器 现在,当您运行应用程序时,您将在模拟器上显示表格视图! 恭喜您取得了如此远的成就。 我们快完成了。 接下来,我们将创建一个TableViewController文件,该文件将链接到TableViewController,以便我们可以开始编写代码。 首先制作文件。 单击命令n ,然后选择可可触摸类 ,然后单击下一步。 接下来,我们将为班级命名。 我们将其称为NamesTableViewController。 确保为UITableViewController选择了子类选项,然后单击下一步,然后单击创建。 现在,您应该有一个名为NamesTableViewController的文件,这将是神奇的地方。 这是好东西。 我们需要做的第一件事是删除NamesTableViewController文件中的所有内容。 它应该看起来像这样。 好多了! 现在看起来不那么恐怖了。 在这里,我们将创建一个存储名称的数组。 像这样 现在是最困难的部分,但不是很难。 我们需要提供TableViewController将显示的数据。 为此,我们需要实现两个必需的数据源功能。 第一个是函数的行数,它仅告诉TableViewController应该显示多少行。 我们希望显示的行数与名称一样多。 因此,如果我们有4个名称,则要显示4行。 因此,从本质上讲,我们希望显示任意数量的名称。 让我们实现该功能。 如果您只是开始输入numberOfRo…。 单击Enter时,它应该自动完成。 在函数类型的花括号内, 返回names.count, names的计数就是我们拥有的名字的数量。 […]

Swift —以编程方式自动布局和绑定方法(2/4)

让我们记住在本系列的最后一部分中所做的事情。 我们展示了如何将UI组件添加到视图层次结构,然后以编程方式设置其属性。 大! 🎉 在这一部分中,我将向您介绍如何通过Omar Albeik的方式设置项目。 记得: 使MVC再次出色! 使用泛型,协议和扩展摆脱大型视图控制器 medium.com ✅项目结构受到控制。 以编程方式自动布局 layoutViews是我们新方法的override方法。 设置我们的约束以获取合适的布局的最佳位置。 ‍🍳 我们是一家出版物,创建有关iOS开发的帖子。如果您喜欢它并想加入我们,请填写表格! tinyurl.com/jointowhoknows

在Swift中了解委派

Swift是最令人困惑的主题之一。 在本文中,您将从使用原因开始,并以示例说明如何实现在对象之间传递数据的示例来完全理解委托。 我们将通过六个简单的步骤探索授权。 当发生特定操作时,“ 委托” 是一种设计模式,允许将数据从一个对象传递到另一个对象 我们为什么使用委派? 每当我们试图将数据从一个对象传递到另一个对象时! 在本文中,我们将练习在TouchableView和ViewController之间使用委托和协议来传递数据。 单击蓝色圆圈时,在输出中将显示消息“这是来自委托人的消息”。 首先,请先下载该入门项目! 打开TouchableView.swift并找到第一步。 首先创建一个协议并将其命名为tapDelegate 。 该协议可以具有多种功能。 对于这种情况,我们将创建一个名为tappedButton的函数。 协议是一个蓝图 。 该蓝图列出了所有必需的要求,例如方法和属性 。 在第一步中,该协议被类采用。 该类为我们提供了一种实现协议内部创建的功能的方法。 出于可读性考虑,使用“代理”一词来命名该协议是一个好习惯。 让我们创建一个委托属性并将“类型”设置为协议。 确保在前面添加关键字weak ,并将类型设置为带问号的可选。 弱关键字用于避免保留周期和可能的内存泄漏。 一半! 我们想让ViewController知道 每当按下蓝色圆圈时。 为了建立连接,我们需要将在步骤1中在协议中创建的委托方法调用添加到handleTap函数。 ViewController从哪里获取数据? 从我们在TouchableView中创建的代表! 为了实现此目的的连接,我们将tapDelegate应用于ViewController 。 当协议被采用时,要求ViewController必须使用蓝图中列出的方法或属性。 为了符合协议,我们将创建蓝图中列出的功能,并在按下蓝色按钮时键入一条消息。 最后,我们将委托分配给self。 你为什么要问自己? Self引用类ViewController 。 由于ViewController是要委派的那个,因此我们将委托从touchableView设置为ViewController (自身)。 恭喜! 继续运行模拟器。 按下蓝色按钮,您应该会看到一条消息。 如果您没有在底部看到调试器区域,请按Xcode中的Command + Shift +Y 。 你会看到这个⬇️

Swift 100天:项目24 –如何仅将一个ViewController旋转为横向方向?

环境:Swift 4 /天:88 /日期:2018年1月12日/时间:6小时 我学到了: ・现在旋转很快就变得愚蠢。 为什么? 👇 ・由于要旋转的特定视图控制器中嵌入有标签栏或导航栏,因此没有简单的方法(如简单地调用一个函数)来旋转它。 ・如果只有一个视图控制器而没有选项卡栏或导航栏,这在实际项目totally中是完全不现实的,则可以根据是否允许旋转,将’shouldAutorotate’覆盖变量设置为true / false。 如果您打算像我一样只在一个视图控制器中进行旋转,则可以开始谷歌搜索并找到以下资源: 如何在iOS Swift中仅将一个View Controller旋转为横向 仅使用纵向创建整个iOS Swift项目可能会很棘手,而当您的应用程序远远落后时,突然之间… www.jairobjunior.com 这是一篇很棒的文章,只有一个大问题: 完全过时!!! 我记得它是用Swift 2.3编写的,过时的代码几乎无法使用。 👊平视👊:在下面的示例中, 该应用程序仅在所有视图控制器中允许“纵向”,只有一个允许“ allButUpsideDown” 。 确保您的应用也适合这种情况,或者稍微转移代码以适应这种情况。 1.首先,您需要确保“设备方向”看起来像这样,这意味着仅选中“纵向”模式。 2.将以下两个功能添加到AppDelegate中,以帮助您处理上述在导航栏/标签栏中嵌入的情况: 来源: 如何仅将一个View Controller旋转为iOS Swift中的横向方向

使用PDFKit渲染PDF文档

对于开发人员而言,在移动应用程序中集成PDF呈现功能始终是一项艰巨的任务。 无论是Android还是iOS,开发人员通常更喜欢使用第三方库或本机c / c ++ /低级代码来呈现pdf文档。 好消息来了! 苹果最近在iOS 11中添加了PDFKit框架,这使得PDF渲染变得非常容易。 在本文中,我将重点介绍PDFKit中可用的两个最常用的功能。 呈现PDF文档。 创建指定文档页面的缩略图预览 PDF渲染 注意。 在自定义类字段中键入PDFView时,没有自动补全功能。 让我们了解一下我们可以在PDFView上应用哪些属性。 PDFDisplayMode 您可以使用框架中提供的4种displayModes中的任何一种 singlePage:仅显示1个具有滚动支持的页面。 singlePageContinuous:显示带有滚动条支持的整个PDF文档,以在多个页面之间滚动。 twoUp:滚动条支持并排显示两个页面。 twoUpContinuous:并排显示具有2页的整个pdf文档。 2. PDFDisplayDirection 提供两种滚动模式,即垂直和水平。 垂直:在页面之间垂直滚动。 horizo​​ntal :启用页面之间的水平滚动。 3. autoScales = true :以下是来自Apple开发人员文档的摘录。 //对于连续模式,这是“适合宽度”行为,对于非连续模式,这是“最佳适合”行为。 4. 提供文件网址 let path = Bundle.main.path(forResource:“ MFI_2018_01”,ofType:“ pdf”) 让url = URL(fileURLWithPath:path) 让pdfDocument = PDFDocument(url:url) pdfView.document = pdfDocument 加载文档缩略图 通常,我们遇到要求时,我们只需要显示PDF文档中的特定页面缩略图即可。 从实现的角度来看,这听起来还是很吓人的,但是PDFKit使其非常简单🙂 创建PDFDocument对象。 […]

如何:在Swift中映射,缩小和过滤

由Reinder de Vries撰写于2017年5月3日在App Development中 Swift的编程功能Map,Reduce和Filter可能难以挑战。 特别是,如果您总是编写for循环来解决迭代问题! Map,Reduce和Filter函数来自函数编程领域。 在Swift中,您可以使用Map,Reduce和Filter遍历诸如Array和Dictionary集合类型,而无需使用for循环。 在构建应用程序时,通常使用过程式或面向对象的编程方式。 函数式编程是不同的:它仅处理函数。 没有变量,没有“状态”,没有for循环-只是函数。 Swift编程语言非常适合于函数式编程。 但是,您无需严格地编写功能代码,只需采用功能编程中的概念(例如Map,Reduce和Filter)即可帮助您学习如何更好地编写代码。 Map,Reduce和Filter通常被称为高阶函数 ,因为这些函数将一个函数(一个闭包)作为输入,而将返回函数作为输出。 严格来说,Swift将在使用高阶函数时返回操作(即映射数组)的结果,而“纯”函数语言将返回函数的集合。 如果您在想:“伙计,我不需要功能编程或数据处理,因为我的应用程序不需要这样做!” —不要在这里停下来。 在最近的应用程序项目中,我多次使用过Map,Reduce和Filter: 过滤成本/收入值,使其达到一定阈值,然后再将其包含在折线图中 将成千上万的电影评分降低为一个平均评分 在此Photo App模板中的标签上映射一些操作(小写,删除“#”) 您当然可以通过for循环解决所有这些问题,但是您会发现使用map,reduce和filter函数可以使代码更简洁,可读性和性能更高。 在本指南中,您将学习如何使用地图,缩小和过滤功能。 您将对集合类型 (如Array执行这些功能。 以下是简要概述: map函数遍历集合中的每个项目,并对集合中的每个元素执行操作 reduce函数循环遍历集合中的每个项目,并将它们组合为一个值 filter函数遍历集合中的每个项目,并返回仅包含满足包含条件的项目的集合 换句话说: map功能将功能应用于集合中的每个项目。 考虑将一组值“映射”到另一组值。 reduce函数将一个集合变成一个值。 可以认为它实际上是将多个值减少为一个值。 filter函数仅返回通过if -statement条件且仅当该条件导致true的值的数组。 有趣的事实: MapReduce是基本的大数据处理概念,其中对集合并行执行密集操作。 一个示例是将一本书的页面概括为一个单词(映射),然后将这些单词存储在字母框中(减少)。 跳至相关章节: 使用地图功能 使用减少功能 使用过滤功能 链接图,缩小和过滤 结论 准备? 我们走吧! 成为专业的iOS开发人员 开始使用iOS 12和Swift 4 注册我们的iOS开发课程“ 零到App […]

Como Programar en Swift con iOS 12(第4部分)

入门教程中的“ Bienvenidos a la cuarta yúltimaparte de esta serie de tutorials”。 海斯维斯-洛斯坎特克雷科斯-德约热尔马 在部件上重新添加新的部件,并以100%的最终加工成本获得新的认证。 Instagram上可能出现的所有结果都可能会导致3个方面的差异。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。 佩罗·奎罗多·阿佩兰迪斯·佩雷斯·佩雷斯·佩佩尔·佩佩斯·佩雷斯·格兰德。 ->进入Project Navigator hacemos,然后点击Main.storyboard Hacemos doble单击上级用户可见的UILabel,在上级编辑器中显示vemos que nos da laopciónde poder编辑器。 Lo cambiamos por el siguiente“ Edad de mi perro ” Cuando le damos单击一个自定义的Xcode代码,然后单击ViewController.swift 。 从根本上说,可以直接从监视器或显示器上还原监视器,而从另一个方面来看,这是一个不错的选择。 在主界面上保存连接的视图。Main.storyboard hacia el ViewController Seleccionamos elbotón“ Empezar de nuevo ”,contelbotónderecho delratón和manteniéndolopulsado arrastramos elratónhasta la clase […]