Tag: 编程

Yummypets iOS应用程序堆栈

今年即将结束,我们想为 Yummypets 应用程序 共享iOS堆栈 。 我们开始做吧! 码 该应用程序的97%是完全用Swift编写的。 总共46k行代码。 MVC 整个应用程序遵循good’ol MVC模式 。 当控制器太大时,我们会将它们重构为较小的控制器。 核心 我们所有的模型逻辑和网络代码都封装在Core.framework中。 这迫使我们将逻辑和视图代码分开。 这也具有使我们能够在不启动完整应用程序的情况下处理纯逻辑的巧妙优势。 网络层 我们的网络层隐藏在Api界面后面。 这意味着我们的View控制器对我们的网络库一无所知。 这也意味着我们可以将api实现切换为返回虚拟数据以进行测试,而无需触摸控制器\ o /的任何一行 。 图像加载和缓存🖼 我们使用Kingfisher异步加载图像和缓存处理。 该api很简单,但是非常可定制。 我们以前使用AlamofireImage,但由于性能原因而切换到Kingfisher。 联网☁️ 对于网络,我们使用ws☁️,这是一个简单的基于诺言的JSON网络库。 它具有打包3件东西的优点: 出色的Alamofire库,用于网络请求 一个简单的Promise库 一个简单的JSON解析库 这种整洁的抽象层使我们能够有效地添加和维护路由。 异步🕐 我们严重依赖Promises来保持我们的异步代码清洁和可维护 。 为此,我们使用🎬 JSON解析⚙️ 我们对JSON解析库有严格的要求:不应强迫我们对模型进行子类化,同时支持类和结构,并且要尽可能简单。 为此,我们使用Arrow🏹,它将为我们处理所有样板JSON解析代码,并保持模型映射的清洁和可维护。 布局🏝 我们不会使用Storyboard或Xibs ,原因是我们在此不做详细说明。 TLDR : 更容易维护 。 您可以在这里找到有关此问题的精彩文章。 是的,我们所有的视图和TableView单元格都在代码中! 这带来了巨大的好处! 如您所知,纯自动布局的代码非常冗长 ,这就是为什么我们使用Stevia🍃使其保持可读性和可维护性 […]

📸迅捷相机-第1部分

iOS 11带来了许多新的酷功能,例如机器学习和增强现实。 因此,您可能需要测试这些功能或创建出色的应用程序。 但是,如果您注意到其中一些需要自定义相机并访问相机框架。 iOS有很多API,供我们访问设备相机,捕获图像并对其进行处理。 AVFoundation是您应该关注的框架。 由于此框架非常庞大,并且有很多方法可以实现所需的功能,因此我决定撰写有关以下内容的博客文章集。 创建自定义相机视图 从自定义相机拍照 使用录制视频 检测面部并扫描QR码 (如果您需要一些特定的东西,请在评论中问我。我将尝试写/学习此内容) 对于所有想跳过博客文章并查看实际代码的书呆子。 我被你盖住了。 这是Github回购。 请密切注意此仓库,因为我将在同一应用程序中添加所有功能,并且如果您想提高代码质量,欢迎PR /问题。 rizwankce /相机 sw swift github.com中的iDevices自定义相机

越来越难像您已精通iOS开发。

您已经进行了很多工作以保持技能的领先,但是角色不断扩大,并且在整个新领域中您的知识可能不足。 您想成为一名高级程序员……但是您将如何实现呢? 由于在线内容数量众多,因此很难决定下一步需要学习什么,甚至是否可以应用。 如果您厌倦了筛选低质量,无关紧要的内容,并且想要针对实际问题的简短实用的解决方案,请相信以前走过这条路的专家。 在迈向精通的过程中,我们距您仅几步之遥,而我们的激情就是使您到达那里。 您将从一位值得信赖的指南中获取知识,该指南为当今的行业领导者提供培训团队和解决问题的能力。 进行14天的免费试用,开始在Frontier上观看我们的iOS大师技能包,其中包括10个有关iOS开发中适用主题的截屏视频。 人们说过的好话: “内容很棒,提醒您即使您认为自己从内到外都了解iOS开发,仍然可以学到很多。” “我喜欢知识的小块。 我学到了一些新东西,这让我继续学习感到兴奋。 “ “能够访问视频真是太好了。 他们提供了许多我感兴趣的主题的快速简单的介绍。” 转到iOS大师技能包 前往BigNerdRanch.com

MVVM + FlowControllers路径的动机–杰出发明–中

有许多种构建iOS应用程序的方法。 MVC(模型视图控制器),MVP(模型视图演示者),MVVM(模型视图模型),VIPER(视图交互器演示者实体路由),Redux……当然,您可以命名其他许多名称。 我已经编写iOS应用程序已有一段时间了,并且我注意到MVVM + FlowControllers方法对我来说非常有效。 在这篇文章中,我想重点介绍“为什么?”,而不是其他方法,以及“如何?”,我在自己的应用程序中使用了它。 为什么? 开始 开始iOS开发通常与学习基本模式有关,您可以使用这些基本模式来解决在尝试在应用程序中创建第一个屏幕时遇到的问题。 MVC很可能是第一个处理您的视图和逻辑的模式,该模式在iOS开发人员中非常流行(不仅限于它们)。 这主要是由于Apple在UIKit框架和您可以在其教程中找到的代码示例中大力推广了这种模式。 MVC不好吗? 是! 这是最糟糕的! 这会导致Massive ViewControllers出现在您的应用程序上……开个玩笑…… 不,这不对。 当我最近阅读“关于iOS应用程序体系结构的很多话”一文时,我感到非常高兴。 我不能说我完全同意那里所说的一切,但是我可以肯定地认同某些部分。 为什么我很高兴阅读这篇文章? 因为这句话: “没有人会强迫您在一个控制器中实现多个数据源。 在viewDidLoad中发起网络调用。 在UIViewController中解析JSON。 用Singleton实例硬连接View。” 许多开发人员将MVC的混乱和混乱归咎于MVC,而这实际上是由开发人员自己造成的。 如果您缺乏纪律,那么即使VIPER也无法为您提供帮助。 某些模式可能使更容易正确地构造代码并保持代码整洁,但是是否遵守纪律始终取决于您。 如果最后还不错,我应该使用MVC吗? 如果我是一名熟练的顾问,我可能应该说“这取决于”。 MVC显然有其优点和缺点,我敢打赌,您会发现许多很棒的文章将帮助您下定决心。 为什么选择MVVM? 如果MVC还不错,那么我遵循MVVM路径的动机是什么? 仅举几个例子: 它使我可以将代码的很大一部分远离UIKit (这是一种可以更快地测试此代码的功能–作为macOS框架)。 它使我能够测试驱动视图的逻辑。 它与反应式编程方法非常有效(但您无需使用它们即可从MVVM中受益) 所以现在,在采用了MVVM模式的原理之后,我能够拥有被动视图(尽可能愚蠢)和驱动视图的逻辑,这些逻辑也与UIKit分离。 为什么不采用像VIPER这样的模式真正很好地定位的划分方法呢? 好吧…你可以做到的。 我以前从未在大型项目中使用过VIPER(很高兴听到您对此的看法!),但是,我想说这种模式对于中小型应用程序可能是一个简单的过大杀伤力。 我认为,如果您想让您的解决方案易于理解,同时又能够轻松测试您的代码,并与依赖于UIKit的代码区分开,那么MVVM会非常有效。 流量控制器 使用它们的动机是什么? 在ViewController“ A”内找到负责转换到屏幕“ B”的代码时,这并不稀奇。 这种方法的问题是,突然之间,您在这两个实体之间建立了紧密的耦合,如果您想在其他情况下拆分或重用它们,可能会遇到麻烦。 好吧……问一个问题总是很好–这是一个问题吗? 如果您正在做一些简单的事情,那么使用这种导航可能会很好,但是,如果您要处理更复杂的事情,添加flowController肯定会有所帮助。 请记住,添加flowController并不是一项高成本的任务-即使在简单的应用程序中,我也倾向于使用它们,因为它们可以帮助我更好地组织代码并让我对应用程序中导航的工作方式有个很好的了解。 将flowController添加到您的应用将帮助您: 使屏幕彼此分开,这将使您可以模块化并轻松地重复使用它们。 控制应用程序各部分的流程(您可能会有许多不同的flowControllers) […]

亲爱的泰勒·斯威夫特,#LookWhatYouMadeMeCode

亲爱的泰勒·斯威夫特, 您的名字是软件开发社区中最受欢迎的歌手歌曲作者的名字之一。 只看这本教科书(即使它已经过时了!)… 您是否曾经考虑过学习编码? 好吧,我只想说您有很多软件开发人员! 只需检查这些项目。 看看你让我做什么代码 凯瑟琳·霍奇(Kathryn Hodge) 项目:她试用了腕带,并向观众展示了她的声誉巡回演出的视频。 萨拉·罗宾逊(Sara Robinson) 项目:使用TensorFlow对象检测API,ML引擎和(当然)Swift的Taylor Swift检测器! 在这里查看更多。 艾琳蹦床 项目:使用Python分析Taylor Swift的歌词。 在这里找到更多。 迅捷的语言 另外,如果您是开发人员,则可能了解Swift编程语言。 它与泰勒·斯威夫特(Taylor Swift)没有关系(尽管也许有一天会如此!),但我发现这些回应很有趣。 泰勒(Taylor)—您显然受到计算机科学界的喜爱。 如果这些事情听起来很酷,那就在音乐会开始的那几天,在休斯敦参加世界上最大的科技会议(格蕾丝·霍珀会议* GHC!)吧! 今年GHC 18售罄,有18,000名服务员❤ 让我们向您介绍这个迷人的编程世界。 火花会飞! 如果您已经创建了与Taylor Swift和/或声望巡回赛相关的内容,并希望将其包含在这篇文章中,请给我发电子邮件blondiebytes@gmail.com。 一些使您入门的想法: 使用命令行在Python中进行Taylor Taylor测验 带有蛇的增强现实应用程序! 看您让我做什么,增强现实僵尸口罩视频 让游戏开始。

Swift中的函数式编程

如果我们查找有关函数式编程的文章,则其中大多数都在谈论高级函数式编程,例如副作用,无状态,不变性或monad之类的内容 ,而其他基本示例(例如map的工作方式)则太简单了,但是在这里试图通过使用Swift中的示例来展示函数式编程的实用方面。 这篇文章的第一部分将为您简要概述函数式编程和基本定义。 示例部分显示了如何以功能样式编写命令性非功能代码。 高阶函数 函数式编程语言的第一个显着区别是,可以将函数分配给值并传递给其他函数。 这就是为什么他们被称为头等公民。 当您说一种语言具有一流的功能时,这意味着它将一种功能视为值,您可以将一个功能分配给一个变量,或者将其传递。 一流的功能被视为一个对象。 有一个更高层次的功能。 它们接受一个或多个函数作为参数或返回其他函数。 高阶函数是可以在其他函数上使用的函数,即它们将函数作为参数,也可以返回一个函数。 映射,过滤,缩小 Map是著名的高阶函数之一。 Map在数组(更确切地说是集合)上工作,它接受一个函数(称为transform)作为参数,并将此transform函数应用于每个元素,并返回结果数组,作为“ transformed”元素的新数组。 使用map有一些优点:它更短并且需要更少的代码 , 更少的错误空间 ,更重要的是它更干净 。 假设我们有一个字符串数组,要计算每个字符,我们必须1.遍历该数组,2.获取每个元素的计数,3.将其追加到新数组中: let houses = [“Stark”, ” Baratheon “, ” Targaryen “, “L annister “] var letterCounts:[Int] = [] 用于房屋{ letterCounts.append(item.count) } print(letterCounts) // [5, 9, 9, 9] 5,9,9,9 // [5, 9, 9, 9] 显然,功能性方法更为简洁: […]

Kata18的快速解决方案:传递依赖

戴夫(Dave)的第18张kata请求我们建立一个简单的传递依赖分析器。 代码下载以及我对本系列其他片的解决方案。 关于依赖项的一个隐患是,它们是可传递的-如果A依赖于B并且B依赖于C,那么A也依赖于C。因此,让我们编写一些代码来计算一组项目的完整依赖项。 该代码将一组行作为输入,其中第一个标记是项的名称。 其余的标记是此第一项所依赖的事物的名称。 对于kata的第一部分,最好将数据结构可视化为树 在图中,A依赖于B,C,D和E。 为了使代码域特定,我为Node和DirectDependencies创建了一个类型别名。 这使得在使用代码时可视化我们所指的内容变得更加容易。 typealias节点=字符串 typealias DirectDependencies = [节点:[节点]] add方法用于加载节点及其依赖项,并将其存储在allDirectDependencies字典中。 当调用findAllDependencies(node :, directDependencies :)时,我们递归地“沿着树走”,从传入的节点开始,并跟踪所有直接依赖项。 在我们遇到循环依赖的情况之前,这种方法可以正常工作。 哪里 A依赖于B B依赖于C C依赖于A 有两种方法可以处理这种情况,第一种是检测它,但是只对每个节点进行一次评估以避免无限循环。 第二个(以及我所讨论的)是说循环依赖项是无效状态,并引发异常。 我创建一个allDependencies属性,在调用findAllDependencies方法时将其添加到初始节点。 每次通过递归循环时,我都会检查是否找到的所有indirectDependencies已存在于allDependencies中。 如果没有,我将它们添加到集合中。 如果是这样,我会跳出循环并返回DependencyError.Circular类型的错误。 有关此Kata的完善功能实现,请查看Josh Smith的解决方案。

如何在Swift中计算时间和节奏

在本文中,我将描述一种在Swift中将速度作为一个单元工作的简单方法。 音乐节奏通常以bpm(每分钟的节拍)表示,对于许多任务(如同步动画,安排声音或验证音频循环的长度),将其转换为秒通常会很有帮助。 代码 struct Tempo { var bpm: Double func seconds(duration: Double = 0.25) -> Double { return 1.0 / self.bpm * 60.0 * 4.0 * duration } } 正在使用 let myTempo = Tempo(bpm: 110.0) let quarterNoteLength = myTempo.seconds() let barLength = myTempo.seconds(duration: 1) let phraseLength = myTempo.seconds(duration: 4) 背景 过去,当我需要进行这些转换时,我记了一些笔记,翻转和取消单位,并创建了一个可以解决我的特定问题的语句。 代码看起来像这样: var bpm = […]

关于Swift镜像的思考

Swift镜像是Swift语言中功能最强大但尚未使用的功能之一。 使用动态提取类实例的元数据的能力 令人惊讶的是,Swift镜像非常简单。 下面的实现动态读取与Flower结构关联的属性,并将其打印在输出窗口上。 但是,我们要做的不只是在输出窗口上简单地打印它。 我们可以使用Swift镜像技术为简单的CRUD(创建读取更新删除)操作创建通用数据访问层。 这是使用Vapor SQLite提供程序的简单通用保存功能。 魔术发生在prepareInsertSQL函数中,该函数利用Swift镜像创建所需的sql。 在prepareInsertSQL中,我们动态创建插入实体所需的所需SQL。 用法如下所示: 现在,我们创建了一个非常基本的通用“保存”函数,该函数可以使用Swift镜像的功能来动态生成SQL并将数据插入SQLite数据库。

在Swift中以编程方式创建视图

为什么要以编程方式创建视图? 如果您发现故事板太笨拙或令人困惑; 希望在实现动画等功能时进行更多自定义和控制您的视图; 或者只是想增加技能,您可能想学习和使用程序化视图。 让我们以编程方式创建一个自定义视图! 这篇文章假定您具有以下基本知识:Xcode,Storyboard,Swift编程语言 通过声明变量或在viewController类中键入UIView来创建一个代表新视图的对象。 我将我的名字命名为“ blackSquare”。 实验:尝试更改自定义视图的x,y值,以查看其在视图控制器上的位置如何变化,或创建第二个自定义视图,并将其添加为第一个自定义视图的子视图! 翅❤