在YOOX NET-A-PORTER GROUP(YNAP),我们使用Swift构建iOS应用。 Swift是一种现代,快速且类型安全的编程语言。 在iOS应用开发中,获取有关Swift代码的即时反馈至关重要。 作为一种类型安全的语言,Swift上的大多数安全检查均由Swift编译器在编译阶段完成。 但是,有许多干净的编码实践,例如语法检查,样式等,还需要执行。 在本文中,我们将探讨如何在YNAP的iOS应用中使用Danger,Swiftlint和Travis CI自动执行大多数Swift代码检查过程。 代码审查的过程可能很困难,而对于Swift作为一种新的编程语言而言,这尤其困难。 SwiftLint是事实上的工具,它通过执行适用于特定团队或项目的规则来整理Swift源代码。 我们使用了之前博客文章中提到的一些最佳实践,在TravisCI(即我们的持续集成(CI)服务器)上实现了SwiftLint。 我们的SwiftLint配置具有一些严格的规则,我们曾经在Xcode构建阶段中运行SwiftLint,以便开发人员可以在开发时看到Xcode本身中的警告或错误。 但是,与其等到CI构建到达Xcode构建阶段脚本,还不如等到构建开始时就对代码进行反馈。 为此,我们需要一种在CI构建运行时提供早期反馈的机制。 我们还希望通过pull请求可以看到SwiftLint提供的反馈,以便我们立即采取行动。 这就是危险出现的地方。 Danger是一种在CI上运行的工具,用于处理所有琐碎的代码检查任务,例如错字,空格,换行符等。它还使我们能够超越基础知识,并添加更多项目特定检查或执行测试或文档作为其中的一部分。拉取请求。 在此处的官方网站上有很多关于如何开始使用Danger的出色文档。 规则需要在配置文件(称为Dangerfile)中列出。 规则可以用Ruby,JavaScript或Swift编写。 但是,Swift实现相对较新,我们希望使用脚本语言在CI上的预配置环境中运行Danger。 幸运的是,Travis CI macOS映像随附了预装的Ruby和RVM,从而使安装Danger和大多数Danger插件(例如Rubygems)更加容易。 因此,我们决定用Ruby编写Dangerfile规则,以便在实际开始构建之前就可以在Travis CI上明确运行它们。 有了Danger,我们可以按此处所述配置各种规则,但是我们遵循了Swift和iOS特定的规则。 检查较大的请求,尤其是如果有超过500行代码 检查是否已将单元测试作为“拉取请求”的一部分添加,如果应用程序代码已更改 检查“拉取请求”上是否有标签 检查Podfile或Podfile.lock已更新? 如果是这样,则忽略该较大的请求 这些是Danger轻松实现的非常基本的检查-但其真正功能来自于Danger的SwiftLint插件。 此插件将所有SwiftLint规则应用于“拉取请求”中的代码审查过程,从而使Danger可以在发现SwiftLint警告或错误的任何地方自动对“拉取请求”进行注释。 现在,我们已经介绍了Danger和SwiftLint插件的基础知识,下面我们来讨论如何在Travis CI服务器上进行设置。 我们需要以下各项来在Travis CI上设置Danger。 GitHub上的专用Bot帐户/个人访问令牌 我们在GitHub上创建了一个专用的机器人帐户,该帐户可以对“拉取请求”进行评论。 为了做到这一点,我们还需要创建一个具有写访问权限的Github个人访问令牌,使Bot能够对拉取请求进行注释。 可以在iOS项目的Travis CI设置中将此个人访问令牌配置为环境变量DANGER_GITHUB_API_TOKEN 。 在Travis CI上安装Danger和SwiftLint Danger插件 有了Github访问令牌后,接下来我们更新了Travis配置.travis.yml以在before_script阶段安装Danger和SwiftLint Danger插件,如下所示。 由于Travis CI的macOS映像已使用Ruby和RVM进行了预配置,因此我们只需要在脚本中安装Rubygems即可安装Danger和Danger的SwiftLint插件。 注意:如此处文档所述,危险可在任何CI服务器上运行 在Travis CI上运行危险 […]
欢迎阅读我关于RxSwift的系列文章中的第一篇。 如果您有兴趣学习反应式方法并将其应用于iOS项目,那么您会很幸运! 本系列将通过越来越复杂的功能进行介绍,并说明它们在代码中的实际应用。 让我们开始吧! 响应式编程已经存在了将近20年,但实际上仅在最近十年才引起关注。 为了使响应式编程能够在多个平台上使用,已经对最流行的编程语言进行了扩展。 前缀Rx(在RxSwift中可以看到)表示“反应性扩展”。 关于扩展的重要知识是,所有语言的底层方法都完全相同。 出于很多原因,这很酷,但立即想到的三个是: 您可以使用本机平台和语言来采用反应式编程方法。 您可以轻松地跨语言和平台进行协作。 一旦学习了一种语言的反应式编程,就可以将该知识直接转移到具有反应式扩展的任何其他语言。 听起来很有前途。 那是什么 响应式编程是一种处理异步数据序列的方法。 也就是说,向观察者发出事件的元素的可观察序列。 开始进行反应式编程可能有点吓人,因此在下一节中,我们将布局用于创建和观察序列的阶段,然后解释每个阶段的重要术语和概念。 让我们设置一个基本的可观察序列,然后对每个步骤进行解释:
您是否想学习如何开发自己的macOS应用程序,并以此为荣并在您的个人MacBook上使用它? 或者,也许您有激动的热情开始在Mac上进行开发? 然后,您来对地方了! 在这里,我将引导您完成使用最现代的语言之一Swift开发第一个非常macOS应用程序的步骤。 对编程有兴趣 对Swift编程有一些基本的了解(优势) 已安装Xcode 8.3.3 热情打造macOS应用 macOS开发的基本概念 如何将Alamofire与macOS应用程序集成以执行网络呼叫 如何创建拖放机制 一些Swift 3语法 我敢肯定,您很高兴知道我们将制造什么好东西! 在本教程中,我们将研究Mac的主要应用程序层Cocoa。 该层负责应用程序的外观和用户动作的响应能力,这也是我们将引入所有可视元素,网络和应用程序逻辑的地方。 我们会将图像上传到uploads.im,因为它提供了供我们使用的开放API。 完成整个教程后,这将是最终产品, 首先将向用户显示一个主屏幕,并显示“在此处拖放图像”的说明。 然后,用户可以将任何 jpg 格式的图像 拖动 到应用程序中,然后该应用程序将显示加载微调框,以通知用户它正在将图像上传到服务器。 服务器 成功 响应后 ,用户将获得一个弹出警报窗口,可以在其中 将URL复制到剪贴板 ,然后用户可以将URL粘贴到任何地方,例如在Internet浏览器上从服务器查看其图像。 聊够了,让我们开始吧! 首先,让我们启动Xcode 9并创建名为PushImage macOS应用项目。 在Application下选择macOS和Cocoa App 。 您可以按照我在下一页中输入的设置进行操作,然后为您的项目文件选择一个目录。 现在您已经完成了所有项目的设置,我想借此机会在Xcode 9中重构我最喜欢的一项新功能, 重构! 如果您使用过以前版本的Xcode,则无法重构Swift代码。 让我们试一试。 突出显示ViewController并转到Editor->Refactor 。 让我们将其更改为HomeViewController ,然后单击Rename 。 这将对您的filename , class name和Storyboard viewcontroller class […]
大家好, 在这个美好的假期里,你过得怎么样? 11月和12月是我最喜欢的两个月。 家人和朋友聚集在篝火旁,谈论他们在观看有关Udemy的精彩课程后学到的知识。 好! 也许那只是我的家人。 我真的希望您在假期过得愉快。 为了庆祝感恩节假期,我将开展为期一周的黑色星期五促销活动。 您只要花10美元 ,就可以得到我所有的课程。 那是正常价格的95% 。 查看以下精彩课程列表: 从零开始成为Swift开发人员 掌握适用于iOS的ARKit(在门户网站上添加了新部分) 精通iOS版Core ML 使用Java Spring Boot掌握微服务 使用蒸气2的服务器端Swift 使用Kitura掌握服务器端Swift iOS精益控制器的完整指南 使用Chrome开发者工具掌握Web和移动调试 再次感谢您支持我的课程,并与您的家人和朋友度过了愉快的时光, 穆罕默德·阿扎姆(Mohammad Azam)
有些人可能在网格中遇到了原子团和三角形。 如果正确构造网格,则引擎和三角形将不是问题,但我们并不完美,有时会出错。 因此,本博客将展示一些三角形和凸点的情况,并提供我个人的技术来修复它们。 1。 这可能是我遇到的最常见的三角形,发生在两条轨道发散并且它们之间的空间变成三角形时。 解决这个不需要的三的方法我使用了我所说的菱形方法。 这使用切割或快速循环工具将四分之一的分割成两半,在三角形的一侧之一上形成顶点,从而将其变成菱形。 2。 每当创建圆柱或球体时,就会出现这种情况,几乎不需要更改它,因为它们通常始终保持静态,但是有必要的话,可以摆脱它们。 通过删除内圆上的第二条线,您可以将两次尝试合并为一个多边形,而当三角形合并为单个二维形状时,它们将始终变为四边形。 3。 如果正确生成拓扑,则很少会出现Engon,但是如果您想降低拓扑结构并删除快速循环,有时会发生Engon。 如果swift循环在某个点上发散,则表示您使用菱形方法固定了tri,则整个swift循环将删除,直到产生整数为止的除法。 修复此问题的方法只有两种,一种是重新创建刚删除的swift循环,另一种是将一条分支线与外部线焊接在一起。 所有引擎通过将顶点焊接在一起来固定。
本文将引导您通过自定义集合视图单元格设置集合视图。 事不宜迟,让我们开始吧! 要继续进行,请在此处下载启动项目。 今天,我们将构建一个应用程序,使您可以显示模因及其名称。 步骤1:连接图像和标签视图插座 第一步是将我们的MemeCell.xib图像视图和标签连接到我们的MemeCell.swift文件。 看起来应该像这样: 步骤2:使用MemeModel设置单元 我们的MemeModel包含两个属性(图像和名称),如下所示:
嘿! 您可能知道有太多不同的iOS新闻,几乎可以肯定的是,每个新闻都包含相同的有趣文章。 产生这种感觉之后,我决定创建一个电报频道,以收集文章并将其发布到一个地方。 在引擎盖下,@ iOtbivnoe和我的朋友-@iosartem,监视rss feed,twitter帐户以及所有这些先前提及的新闻通讯,并且仅发布其中的精华内容。 读聚合器 该渠道汇集了来自许多资源的有趣信息。 因此,如果您对Swift,iOS,Apple和… t.me感兴趣 自2017年3月以来,我们一直在为您检查有趣的东西! 今天我们要宣布每月的帖子,其中包含我们发现的最佳文章! 我们开始做吧! 1.从Twitter收集iOS黑客 Twitter技巧7是我最喜欢的+ 6Gb可用空间! Twitter最佳iOS技巧:十月版 medium.com
面部识别有无数的应用,并且每天都在越来越广泛的技术中得到应用,例如移动平台,安全系统和机器人技术等。 Google于2015年推出了“照片”应用,它是智能手机上最实用,实现最完善的应用之一,它可以按人脸搜索照片。 从现在起,您可以轻松找到家人和朋友的照片,并一直追溯到他们出生的那一刻,它的工作原理非常疯狂。 为什么要使用第三方解决方案? Apple的Vision Framework开箱即用,具有面部检测功能,但没有面部识别功能。 在Core ML的帮助下,使用Vision框架绝对可以实现面部识别,尽管这需要将先前训练有素的模型集成到您的应用中。 有很多提供面部识别的服务而没有太多麻烦,包括Amazon Rekognition,OpenCV和Microsoft Azure。 到目前为止,我最喜欢的是Microsoft的替代产品,它非常易于集成和使用,非常灵活,并且具有出色的性能。 尽管本教程仅专注于REST API,但Microsoft Face API在Github上具有iOS SDK。 为了使用Microsoft Azure Face API,我们需要获取Face API订阅密钥。 转到认知服务注册页面。 为Face服务选择“获取API密钥”。 注册一个“免费Azure帐户”(而不是“来宾”,因为该帐户的限制很低)。 完全免费,您将获得200美元的信用额(很多)。 请按照所有步骤创建一个新帐户(或使用您现有的Microsoft帐户登录)。 转到Azure门户。 在顶部的搜索栏中搜索“认知服务”。 选择“创建认知服务”。 在显示的过滤栏中搜索“面部”。 选择“面部”并点击“创建”。 设置名称,位置,定价层,然后选择“创建新”资源组。 11.转到所有资源> FaceService>密钥,然后复制并保存“ KEY 1”(我们将在以后使用)。 12.转到所有资源> FaceService>定价层,并确保已选择“标准”层。 您可以从此处下载入门项目。 运行之后,您应该会看到包含两个部分的集合视图,分别是化身和照片。 如您所见,选择头像目前不起作用。 为了解决这个问题,让我们从导入API消耗类开始。 (请务必仔细阅读代码和注释,以更好地了解Face API的工作原理) 这些警告是因为未使用avatarData和photoData ,让我们来照顾它。 我们将使用这些数据值来请求人脸ID,然后将其分别存储在person和photo对象中。 将这些行替换为: 再次运行该应用程序。 如果加载需要一段时间(约10秒),请不要惊慌,这是因为我们正在为每个图像进行Face-Detect API调用。 在生产应用程序上,您应该只执行一次,并将结果存储在本地或基于云的服务上,最重要的是,永远不要阻塞UI。 另外,请记住,我们正在使用的Face-Detect端点仅存储24小时的面部ID。 如果您需要更永久的解决方案,请参见FaceList。 […]
在这个博客中,我将讨论编写可测试的代码,将解释我主要使用的两种方法,由您来决定最适合自己的方法。 我不是测试专家,这只是我高度使用的两种方法。 也许他们可以帮助您制定自己的首选方法。 这不是一个博客来告诉您您应该做什么和不应该做什么。 我鼓励您关心的唯一事情是将代码分开编写,使其易于阅读并遵循软件设计原则。 您可以在此处找到完整的模块。 meguid /可测试 这是我个人编写可测试代码的场所。 主要是TDD,设计可测试和重写的代码… github.com 我们需要编写一个简单的iOS模块,以帮助用户登录我们的系统。 我们将首先开始编写测试,然后再编写代码以通过此测试。 使用协议,我们可以将模块中的每一层完全分开,因此我们可以对其进行测试,而不必依赖于其他层。 对于我们的登录模块,我们将有两个核心层。 “交互者”的作用是控制模块逻辑,从模块外部(例如视图)采取措施,执行所需的逻辑,然后更新演示者。 “演示者”的作用是根据特定的逻辑来更新UI,演示者不应在意操作背后的业务逻辑。 另一个注意事项,将核心代码(演示者/交互者)与UI(仅导入Foundation)分开是至关重要的 让我们从一个快速的文件“ SignInProtocols”开始,该文件将负责管理层之间的交互,并且可以在解释模块具体功能方面发挥重要作用。 首先,我们需要定义我们的模块输入(也就是我们的模块要做什么)。 因此,我们使用3种方法来定义“ SignInInput”协议来登录和验证电子邮件,密码。 清楚吧? 那么,谁将成为我们的模块逻辑专家? 交互器。 因此我们需要将Interactor的输入定义为模块的输入。 因此,我们可以将登录模块输入操作委派给交互器。 现在我们需要定义Interactor输出。 是登录成功/失败还是电子邮件或密码有效。 目前很好? 那么谁来处理这个Interactor输出呢? 我们的UI大师。 主持人毫无疑问。 因此,像之前一样,我们将Presenter输入设置为Interactor输出。 现在,让我们定义演示者输出,在其中更新我们的UI。 最后,我们需要将模块设置为Presenter输出。 Interactor层将实现Interactor输入协议。 Presenter层将实现Presenter输入协议。 因此,现在我们定义了模块中的每个单元,我们甚至可以在定义各单元所需目的的层类(Interactor / Presenter)中编写一行代码之前轻松编写单元测试,以便我们可以编写测试。 我们编写模拟来创建一个伪图层,该伪图层实现我们的待测试层输出,以便我们可以验证我们的待测试层是否触发了正确的输出。 因此,在测试Interactor时,我们将模拟Interactor的输出协议,并在此输出中编写代码以配置标志,以便我们可以使用它来测试Interactor的行为是否 现在,我们准备测试Interactor的行为。 如果我们尚待编写的Interactor方法正确执行了此测试,则此测试将成功。 我们对Presenter也一样。 并测试一下。 我们做到了。 meguid /可测试 这是我个人编写可测试代码的场所。 主要是TDD,设计可测试和重写的代码… github.com 第一种方法使您能够分别测试每个层。 […]
1号 airbnb /洛娜 用于定义设计系统并使用它们生成跨平台UI代码,Sketch文件,图像和其他工件的工具。 airbnb /洛娜 Lona –用于定义设计系统并使用它们生成跨平台UI代码,Sketch文件,图像等的工具。github.com 2号 Juanpe / SkeletonView 向用户显示正在发生的事情并为他们准备等待的内容的一种优雅方式 Juanpe / SkeletonView SkeletonView –一种向用户展示正在发生的事情并为他们准备他所要包含的内容的优雅方法 。github.com 3号 互动工作室/ TransitionableTab 当在选项卡之间切换时,TransitionableTab使其易于制作动画。 互动工作室/ TransitionableTab 当在选项卡之间切换时,TransitionableTab使其易于制作动画。 github.com 4号 fastred / Optimize-Swift-Build-Times [f:id:junp0819:20171125170942p:plain] 收集有关优化Swift项目的编译时间的建议。 fastred / Optimize-Swift-Build-Times Optimizing-Swift-Build-Times –关于优化Swift项目的编译时间的建议集。 github.com 5号 瑞文德利希/迅捷算法俱乐部 Swift中的算法和数据结构,并附有解释! 瑞文德利希/迅捷算法俱乐部 swift-algorithm-club – Swift中的算法和数据结构,并附有说明! github.com