Swift Auto布局示例

这是一个简单的示例,它无需任何代码即可通过Xcode swift3为iOS应用构建简单的个人资料场景,下面的图片是您可以达到的目标。 我们可以看到那些文本字段的前导在同一垂直线上,其他标签也都在同一行,所以我首先确定顶部项目的位置Y 然后,我为这些文本字段和标签设置了主要约束 现在,我设置上下两个拖曳物品之间的距离,但没有设置绝对位置,因为如果有一天我需要移动这些物品,我要做的就是移动最上面的物品,而那些较低的物品将自动跟随移动。 现在让我们转到按钮,我使左按钮以0常数尾随左边距到0常数的conter X处,而右按钮以0常数尾随X到达中心X,并以0常数尾随右边距。 希望这种简单的Xcode自动布局可以帮助刚开始学习快速语言并在简单插入场景中工作的人员,希望大家喜欢它。

Swift中的自定义运算符功能:矩阵加法

作为一名新程序员,我遇到了许多用于处理信息的新逻辑结构和工具。 但是,我每天至少使用一件事,这似乎需要零新学习:标准数学运算符+,-,*,/。 胜利! 加,减,乘,除…这些符号的工作方式与我在小学时进行简单算术问题时所用的方式相同。 好吧,不是那么快。 一会儿再思考:操作员到底是什么? 当操作数是相同类型时,运算符将在后台执行某些操作以返回结果。 为了简化和总结正在发生的事情,运算符是行为类似于函数但在语法上有所不同的构造。 确实,语法是我们在日常生活中遇到的语法,因此很容易忽略使这些运算符在编程上下文中工作的底层代码。 一旦将运算符视为函数,就自然会问:在另一个环境中,我如何能够实现这种类型的功能? 关于Swift编程语言的一件很酷的事情是,它很容易允许您为自定义和非数字操作数创建运算符函数。 由于我是一个数学迷,因此我选择矩阵作​​为探索如何编写自定义加法运算符的起点。 首先,我必须创建一个Matrix结构。 该结构具有三个存储的属性:矩阵中的行数,矩阵中的元素总数以及在给定这些参数的情况下生成的矩阵本身。 有两个计算的属性:矩阵中的列数和矩阵的字符串描述。 关于后者,我选择覆盖Matrix结构的默认print()输出,以呈现彼此堆叠而不是在超级数组中水平列出的行。 毕竟,这是我大学教科书中矩阵的外观! 刚刚了解了协议,这是我第一次使用该概念。 实现计算的描述属性是CustomStringConvertible协议的一项要求。 接下来,初始化器: 关于此初始值设定程序,最值得注意和有趣的事情可能是它返回了一个可选值。 必须且仅当元素可以在行之间平均分配以创建完美的“矩形”超数组时,才能确保初始化Matrix结构。 (向我的出色同学Cenker喊话,帮助我解决了嵌套循环!)现在,为Matrix结构体创建新版本“ +”的有趣部分是: 同样,与初始值设定项一样,“ +”函数返回可选的Matrix,因为仅当操作数矩阵具有相同维时才可以执行矩阵加法。 我在编写此函数时遇到了一些挑战。 首先,我最初解决该问题的方法是遍历Matrix结构本身。 我根据矩阵属性的[[Int]]类型错误地考虑了matrixA和matrixB。 但是,当我尝试编写对行和列进行迭代的嵌套for循环时,Xcode引发了错误: 我的错误很快变得很清楚。 for-in迭代功能不适用于我的自定义Matrix结构。 我做了一些阅读,发现Matrix必须符合SequenceType协议才能利用for-in循环。 我回头看了我的Matrix结构的内部工作原理,而不是实现该协议所需的功能,该功能将依赖于另一个符合不同生成器协议的自定义结构。 Matrix的哪些属性已经符合SequenceType? 为了实现我的目标,我该如何操纵这些属性而不是Matrix结构本身? 这就是我得出的对矩阵A和matrixB的元素[Int]属性进行迭代以计算总和的方法。 有用! 这是我做过的测试: 显然,要为矩阵数学创建一个全面的模型,还有许多工作要做。 最终,遵循SequenceType协议以利用直接迭代功能将是更理想的选择。 但是,瞧! 已经有开放源代码可以执行此操作: 矩阵结构参考 该集合还使用Apple的 mauriciosantos.github.io 提供了线性代数函数和运算符,例如inverse(),+和*。 尽管如此,解决这些问题有助于我更好地掌握操作员的能力和潜力,并加深了我对更高级的Swift编程约定(如结构和协议)的理解。

Cloud Foundry上的蒸气3

您对如何编写服务器端swift代码感兴趣,并且在第一个hello世界之后,您在脑海中听到了声音,例如“在哪里可以运行此代码”? 因此,一种解决方案是在swift运行时内的Cloud Foundry上运行它。 我知道服务器端快速是当前鲜为要求的话题,但是当我开始使用Vapor 3时,我意识到花了一些时间和一些研究才能在Cloud Foundry上运行它。 我的希望是,如果有人在那里尝试相同的内容,将会找到此博客文章,并且有助于使这些内容正常运行。 现在,让我们开始吧,让我解释一下如何将Vapor 3应用程序带到Cloud Foundry。 首先,您需要访问应在其上运行应用程序的Cloud Foundry环境。 接下来,您需要一个快速的应用程序,就我而言,它是一个简单的CRUD服务,可以处理待办事项。 作为标题 假设,此应用使用了蒸气3 Web框架。 我选择此Web框架,因为我将使用最新的Swift网络堆栈,更好地称为Swift NIO(2018年3月发布)。 Cloud Foundry(CF)的概念之一是对“ 12要素应用程序”模式的大力支持。 CF希望您遵循此模式,并按照“ 12因子应用”网页上主题3所述从环境变量读取所有配置。 在我的情况下,我必须提供一个数据库配置(PostgreSQL),并且对于cf运行时,我必须读取套接字配置,这两者都将通过环境变量提供。 服务器套接字的环境变量名称基于cf运行时。 为此,运行时使用标准变量VCAP_APP_HOST和PORT提供套接字配置。 为了简化本地开发设置,我采用了相同的方法并重用了它。 对于数据库,我使用自己的一组环境变量,并在所有变量前面都加上了PSQL *。 对于我的本地开发,我将所有内容都配置为本地资源,将套接字配置为127.0.0.1:8080,并将数据库配置为本地PostgreSQL数据库。 在CF运行时中,总是为我提供套接字配置,但是数据库变量必须由我自己提供,因此我必须将带有cf set-env的PostgreSQL变量添加到我的CF应用运行时中。 这样,我可以从cf环境中读取托管云PostgreSQL数据库实例的配置,就像在本地计算机上一样。 bash $ cf set-env snatch-todos PSQLHOSTNAME psql.clouddb.hostname.com bash $ cf set-env snatch-todos PSQLPORT 5432 bash $ cf set-env snatch-todos PSQLUSERNAME“ xxxxx” bash […]

iOS View Controller生命周期

介绍: 对于iOS应用开发,最重要的是了解应用生命周期并查看生命周期 通常,有三种方法可以在iOS中制作View Controller。 从.xib 从代码 通过情节提要 这是在生命周期视图中处于活动状态的所有方法: loadView 当视图控制器从代码创建时使用此方法。最好不要对由.xib或情节提要制成的此方法id视图控制器执行任何操作。 在视图加载中做什么:视图控制器在 请求 其 view属性但当前为 nil 时调用此方法 。 此方法加载或创建视图,并将其分配给 view 属性。在此方法中,viewController以编程方式创建。 viewDidLoad: 此方法在视图控制器生命周期中加载一次。在加载所有视图时调用此方法。在此方法中,它的优点是: 1.需要Onece的网络通话。 2.用户界面 3,其他需要一次完成的任务 注意:在此方法中,在定义边界和发生旋转之前为Call调用,因此在此方法中使用大小有风险。 viewWillAppear: 每次在视图可见之前和配置任何动画之前都会调用此方法。在此方法中,视图已绑定但尚未设置方向。您可以重写此方法以执行与显示视图相关的自定义任务,例如隐藏字段或在视图变为可见之前禁用操作。 viewWillLayoutSubviews: 默认情况下,它什么都不做。 当视图的边界改变时,该视图将调整其子视图的位置。 视图控制器可以重写此方法以在视图布置其子视图之前进行更改。 viewDidLayoutSubviews: 在更改其边界后,将viewController调整为其子视图之后,将调用此方法。如果要在设置子视图后对其进行更改,请在此处添加代码。 viewDidAppear: 在屏幕上显示视图之后调用此方法。 通常将数据保存到核心数据或开始动画或开始播放视频或声音,或开始从网络收集数据。这种任务类型适用于此方法。 viewWillDisappear: 从视图层次结构中删除视图之前调用的此方法。视图仍在视图层次结构上但尚未删除。 尚未配置任何卸载动画。 在此处添加代码以处理计时器,隐藏键盘,取消网络请求,将所有更改还原到父UI。 另外,这也是保存状态的理想位置。 viewDidDisappear: 从视图层次结构中删除VC的视图后,将调用此方法。 使用此方法停止侦听通知或设备传感器。 取消初始化: 在将视图控制器从内存中删除之前,它会被初始化。 通常,您可以重写deinit()来清除视图控制器已分配的资源,但这些资源不会被ARC释放。 请记住,仅因为不再可见VC,并不意味着它已被释放。 容器视图控制器(例如NavigationController)可以将其VC保留在内存中。 请记住,即使VC位于屏幕外,如果它仍在内存中,它仍然可以正常工作并可以接收通知。 didReceiveMemoryWarning() 当内存开始填满时,iOS不会自动将数据从内存移动到其有限的硬盘空间。 但是,它确实会发出此警告,并且您(我是说您)负责清除内存中的某些对象。 请注意,如果您的应用程序内存超过某个阈值,iOS将关闭您的应用程序。 […]

Swift的无服务器计算

为什么选择无服务器Swift? 与无服务器计算是否值得追求的问题不同,为什么要在Swift中实现无服务器系统? 有三个主要原因使Swift成为Lambda实现语言的理想选择。 首先,Swift是一种功能强大,健壮且富有表现力的语言,旨在在包括服务器端计算在内的各种环境中发挥作用。 就其本身而言,区别不大,因为可以用这种方式描述其他几种语言(Rust,Go)。 但是,Swift提供了两种附加的可能性-利用现有开发人员资源的机会,以及在系统的多个层(尤其是后端和移动客户端)之间共享代码的机会。 让我们考虑一个示例场景。 一个例子 我决定组建一家初创公司-这是我可以做的酵母菌,一家专门提供美味面包的在线面包店。 由于没有健壮的云基础架构,没有任何自重的面包店会被杀死,因此我的首要任务是构建微服务来处理向客户发送收据的工作。 具体来说,我想要一种服务,其输入是要订购的项目列表。 物品是面包的种类和数量。 例如三个羊角面包。 输入以JSON编码。 输出是收据的字符串表示形式。 它列出了每个订购的项目,其小计以及整个订单的总计。 现在,我不必担心收据太漂亮。 首先,我忽略了网络连接并编写了可用作命令行工具的代码。 首先,我将创建一个新目录,并使用Swift Package Manager(SPM)创建一个Swift应用程序。 请注意,该应用程序将命名为bru 。 姆迪尔布鲁 光盘布鲁 快速包初始化—type = executable 现在,我指定数据类型。 考虑到可重用性,我在与主应用程序不同的模块中定义它们。 我创建一个目录Sources / bruModels,并在该目录中使用以下代码创建Item.swift , Order.swift和Receipt.swift文件(完整列表可在https://gist.github.com/profburke/2e951f48542a9a1ff470515725727751c中找到): // Item.swift 枚举样式:字符串,可编码{ 羊角面包 凯恩 裸露镍 黑麦 } 结构项目:可编码{ 出租数量:整数 let style:样式 } // Order.swift struct顺序:可编码{ 公共私有(设置)各种商品:[商品] … } // […]

哈希表寓言

在Swift中从头开始创建哈希表 理论 哈希表是一个强大的数据结构,大多数开发人员每天都在有意或无意地使用它们。 在Swift字典中是哈希表。 我们应该了解它们是如何工作的,以便我们可以最好地使用它们。 在本文中,我将介绍如何在Swift中制作哈希表的简化版本。 我建议,如果您想了解哈希表的内部工作原理,请遵循并与我一起做一个! 什么是哈希表,我为什么要关心? 哈希表是一种使用键存储和检索值的数据结构。 例如,我可以有一个名称和年龄的哈希表: myHashTable.set(值:30,forKey:“ Manny”) myHashTable.getValue(forKey:“ Manny”)//应该返回30 哈希表的特别之处在于,在正常情况下,我们可以使用键来获取值,而无需遍历数组。 如果我们有一个键值对数组,则必须在整个数组中搜索以找到特定的键值。 这通常称为O(n)访问时间,这意味着获取值的时间基于元素的数量(n)是线性的。 由于哈希表的强大功能,我们可以近似地将值取回O(1)(恒定时间),这使得哈希表非常适合存储我们要基于唯一键快速检索的数据。 重要的是要注意,哈希表不能保持顺序,并且不如用于遍历元素的数组好。 那么,这是什么O(1)法术? 假设您将衣服堆成一堆。 每天早晨,您将不得不在堆里过筛以寻找当天的服装。 现在想象一下,您拥有的所有衣物都有一个抽屉,而这些物品总是放在同一抽屉中。 您将能够非常快速地检索每件衣服! 过于简单的解释是,使用魔术哈希函数,我们的密钥被映射为整数。 该整数将对应于数组中的索引。 这个概念可能看起来像这样: 那么魔术散列函数会是什么样子? 也许为了生成字符串“ Manny”的哈希值,我们可以获得每个字符的整数表示并将它们加在一起。 因此,“ Manny”的哈希值可能等于515。您可能会意识到,由于交换属性“ Manny”将具有与“ Mynan”相同的哈希值。 进行字符串哈希处理有很多更好的方法,但最终它们都只是将字符串转换为整数。 请注意,键不必是字符串,它们可以是任何具有哈希函数的对象。 在理想情况下,每个键都将具有唯一的哈希值,但实际上这是不可行的。 仅根据字符串大小,可能会有数十亿个排列。 如果我们的字母表中只有小写字母,则五个字符的字符串的排列将为26⁵! 想一想,如果您的每件衣服都在自己的独特抽屉中,那么您将需要多少个抽屉。 那么,如何将所有可能的键唯一地映射到数组索引? 我们不! 碰撞和单独链接 哈希函数的目标是将所有可能的键均匀分布到整数范围内。 通过一点数学,我们可以减少这些整数,以便将它们包含在数组大小内。 这将不可避免地导致我们的某些键解析为相同的索引,但不要担心,有几种方法可以处理冲突。 什么是最好的解决方案,让您只用几个抽屉就能穿衣服? 如果您回答将成组的衣服放到抽屉里,那么您是正确的。 如果您只是大堆衣服,那么您的早晨一定很O(n)。 在这篇文章中,我选择使用称为“单独链接”的碰撞解决方案。 通过单独的链接,我们仍将使用键的哈希值来获取数组中的索引。 但是,这次我们将在该索引处有一系列键值对。 这使我们可以将可解析为相同索引的键值对放在可搜索链中。 为了简单起见,我们将使用数组来实现这些链(通常使用链表)。 这是“单独链接”的样子: […]

如何创建自定义可移动UITableViewCell / UICollectionViewCell。

难度等级:容易 在本教程中,您将学习如何通过长按手势来制作可移动的表格视图单元格。 您可以在我的github页面上找到相同的教程。 bhaveshtandel17 / MovableTableViewCell MovableTableViewCell –在本教程中,您将学习如何通过长按手势来移动表格视图单元格。 github.com 怎么做? 添加UILongGestureRecognizer 处理UIGestureRecognizerState.began 处理UIGestureRecognizerState.changed 让我们开始吧!! 🎉

使用Alamofire快速检查互联网连接

我将medium.com视为一种将代码保存在远程位置的介质,以便可以从任何地方访问它。 这可能对别人没有帮助。 🙂 对于Swift 3+和Alamofire 4.4 ,我创建了一个名为Connectivity Swift类。 您可以使用Alamofire NetworkReachabilityManager类,并根据需要configure isConnectedToInternet()方法。 我只是在检查设备是否已连接到互联网。 import Foundation import Alamofire class Connectivity { class func isConnectedToInternet() ->Bool { return NetworkReachabilityManager()!.isReachable } } 用法: if Connectivity.isConnectedToInternet() { print(“Yes! internet is available.”) // do some tasks.. } 编辑:由于swift鼓励计算的属性,您可以更改上述函数,如: import Foundation import Alamofire class Connectivity { class var isConnectedToInternet:Bool { return NetworkReachabilityManager()!.isReachable […]

如何在iOS 12中通过屏幕时间控制小工具的使用

艾伦·斯通布里奇(Alan Stonebridge) 您是否真的知道每天花费多少时间拿起iPhone检查事物? 在这里和那里的几分钟很快就累了,而且由于您可能不愿意手动记录iPhone和iPad的使用,因此Screen Time可以为您完成操作。 这项新功能使那些相同的设备能够在控制小工具内的过程中发挥作用。 您可以使用它来:了解您的行为; 设置软限制,以在每日配额用完时引导您朝正确的方向前进; 并设置铁杆锁定,以停止活动,直到输入密码为止。 有真正的小工具成瘾吗? 找一个朋友看管代码,并尽自己的良心。 此功能也可以应用于“家庭共享”组的其他成员,以帮助您的孩子养成更健康的习惯。 监控您的统计信息 您无需记住访问“屏幕时间”的设置来检查使用情况。 您会收到定期通知,以检查您的每周报告,如果您想在习惯此功能时更随意地关注事情,请在“锁定”屏幕或第一个主屏幕上向左轻扫以进入“今日”视图,然后滚动在其底部,点击“编辑”,然后添加“屏幕时间”小部件。 Mac呢? 屏幕时间在Mac上不可用,即使在macOS Mojave中也是如此。 您将需要意志力来避免浏览未记录的分钟。 如果您迫不及待想看看苹果是否会在将来添加它,请尝试Timing的Productivity版(39英镑,timingapp.com)。 如何开始使用“屏幕时间” 1开启 转到“设置”>“屏幕时间”(第二组向下),然后打开该功能。 系统将询问您要设置的设备是您的还是孩子的。 我们已经写了此建议,就像设置您自己的设备一样,但是您可以通过在此页面的“家庭”标题下轻按每个家庭成员的姓名,对每个家庭成员应用相同的方法,但设置不同。 2简单概述 顶部的框显示了您今天在所有iOS 12设备上花费了多少,并将其细分为主要类别以及在每种设备上花费了多长时间。 您可能不在乎是否花费了大量时间使用生产力应用程序,但是如果发现自己在社交网络或游戏上花费了大量时间,则可能会有所不同。 3整理数据 要大致了解已登录到您的iCloud帐户的所有iPhone和iPad的使用情况,请降低“跨设备共享”功能。 然后,该页面汇总了所有已注册的iOS设备中的数据。 不过,您仍然可以查看单个设备的使用情况:首先点击顶部组中的“所有设备”。 4更详细的信息 最初,下一页显示了您已打开“屏幕时间”的所有设备的数据,但仅今天。 使用顶部的标签查看平均每日使用量以及上周的总计-后者可能会鼓励您限制自己的活动。 将手指放在图表中的条形上以获取该时间段的信息。 点按设备以选择要查看其数据的单个设备。 如何使用“屏幕时间”的数据 1您最常使用的 “最常使用”组列出了应用程序和网站。 点击一个以获取更多信息。 根据上一页的选择,您会看到每小时或每天的细分。 将手指放在条形上并在图表上滑动以了解每个时间段。 2按应用限制 认为您过多使用应用程序或网站? 点击添加限制,然后在大多数情况下拨入所需的限额。 如果您想在某些天(例如,在周末)花费更多或更少的时间,请点击一天的“自定义天数”,然后拨另一个额度。 3按类别限制 返回“屏幕时间”设置的顶层,点击“应用程序限制”,然后点击“添加限制”。 此处的区别在于,该限制会影响您选择的类别的所有应用。 每周和每天的覆盖也可以在此处应用。 4造成停机 停机时间是一天中可以完全阻止使用设备的时间。 比如说晚上的家庭聚会。 […]

如何为OneBusAway for iOS提供对您位置的访问

如果您在使用OneBusAway for iOS时遇到问题,该应用程序无法在屏幕上显示您的位置,并且地图也无法放大以显示周围的环境,则可能需要授权OneBusAway来访问您的位置。 关于OneBusAway OneBusAway是一个免费的,注重隐私的开源软件,可为过境乘车者提供有关其车辆当前位置以及何时到达的实时信息。 您可以在项目的网站上了解有关OneBusAway的更多信息,或从App Store下载该应用程序。 在华盛顿普吉特海湾尝试OneBusAway; 俄勒冈州的流氓谷 加利福尼亚圣地亚哥; 或佛罗里达州坦帕湾。 纽约市也有品牌版本的OneBusAway。 波兹南,ŚrodaWielkopolska和波兰科尔尼; 华盛顿特区; 和加拿大的约克。 tl; dr: 打开设置 公开隐私 开放位置服务 打开OneBusAway 选择“使用时”选项 步骤1:开启设定 导航至主屏幕 (在iPhone X型型号上从屏幕底部向上滑动或在较旧型号上按Home键),然后点击设置 。 第2步:打开隐私 向下滚动,直到看到标有“隐私”的表行,然后点击它。 步骤3:开启位置服务 点击“位置服务”。 步骤4:打开OneBusAway 向下滚动应用程序列表,直到看到“ OneBusAway”。该列表是按字母顺序排列的,因此您可能需要滚动一定距离。 点击“ OneBusAway”。 步骤5:授予权限 最后,将授予OneBusAway的权限更改为“使用应用程序时”设置。 下次重新打开OneBusAway应用程序时,一切都会按预期进行!