Tag: 开发人员

认识团队:Francesco Deliro,移动第一工程师

当我购买第一台笔记本电脑时,一切就开始了。 每次遇到问题时,我都想自己修复,直到解决问题后才离开办公桌。 我参加了不同的编程课程,并阅读了很多文章。 在对编程充满热情之后,我决定以谋生为生。 我作为iOS开发人员已经3年了,我相信这只是一次激动人心的冒险的开始。 无论是舒适的环境还是友善的人们,We Are Mobile First办公室都是我喜欢工作的地方,他们和我一样拥有同样的热情,也富有挑战性。 宜人的天气,美味的食物,多元文化的环境和海滩使巴塞罗那成为理想的居住场所。 它既不会太大也不会太小。 您在这里不会感到无聊。 在寒冷的几个月里,我喜欢写故事和阅读。 在温暖的季节,我喜欢在海滩上度过时间或做运动。 我也喜欢旅行和与家人共度时光。 阅读更多我们的博客文章:www.wearemobilefirst.com

查看Swift中的装饰

本文适用于开发人员,iOS爱好者以及在确保移动应用程序中的视觉连贯性方面遇到挑战的任何人。 让我解释。 有时,您的移动应用程序中不同类型的元素具有相同的外观,对吗? 他们是连贯的。 通常,实现此目标是有代价的:您最终编写了许多行重复的代码,希望这样做不会使所有内容的可维护性降低,并且在需要时也很难进行更改。 一种可能的解决方案: 常量 。 正确分组并正确使用常量可以解决不一致问题,但是可维护性和代码简单性不会显着提高。 一定有另一种方式…… 在尝试找到一个简单,优雅的解决方案时,我想到了一个接口,该接口定义了一个入口点,用于在整个应用程序中自定义UIKit元素。 这个概念称为ViewDecorator 。 模式的核心是通过以下协议定义的,描述了装饰器对象的行为: 通过将外观包含在这些分隔符对象中,可维护性和可读性得到提高,重复代码行减少了。 想象一下,在更名的情况下修改组件的样式有多么容易。 😄 访问UIView子类的属性 由于协议采用特定的UIView类型,因此在尝试自定义特定的UIView子类属性时可能会遇到问题。 一种可能的解决方案可能是将视图实例转换为decorate(_ view: UIView)内的预期类型,但这会搞乱单一职责原则,并使其在不同种类的实例上的行为有所不同。 相关类型进行救援! 让我们看看装饰器对象如何变化: 很整洁吧? 我很高兴听到您对这个解决方案以及我可能没有想到的有趣用例的看法。 您也可以转到我的博客以获取更多文章。

依赖类型(在Swift中)拯救世界!

依赖类型(有时称为约束类型)使代码更安全,更易于使用。 使用从属类型是最有用和鲜为人知的编程概念之一。 我希望阅读完这篇文章后,您会觉得自己像个机械师,刚刚学会了如何加工自己的零件。 我将提供一些背景知识,然后向您展示依赖类型如何拯救世界。 什么是从属类型? 在计算机科学和逻辑中, 从属类型是其定义取决于值的类型。 “整数对”是一种类型。 由于对值的依赖性,“第二对大于第一对的整数对”是从属类型。 —有关相关类型的维基百科文章 由于在Swift中基本类型和用户类型之间几乎没有区别,因此您很有可能已经使用了依赖类型。 考虑无符号整数类型: UInt UInt(正好:1)// 1 UInt(正好:1.0)// 1 UInt(正好:-1)//无 是否能够创建UInt取决于 a)您传递给初始化程序的值为正,并且 b)可解析为整数的值 使用UInt ,是在传达要处理的正整数的信息。 这是有帮助的。 是时候拯救世界了! 假设我们的工作是为核电厂编写软件。² 如果反应堆过热,则可能引发气候事件并导致地球生命的尽头。 我们需要一个函数来冷却它: func addCoolantToNuclearPowerPlant(加仑:整数) 可能您可以用负数来称呼它: func doEmergencyStuff(){ addCoolantToNuclearPowerPlant(加仑:-1000000) } 您已经排干了所有水,并引发了核灾难。 很容易看出为什么UInt类型将是此参数的更安全选择。 func addCoolantToNuclearPowerPlant(加仑:UInt) 现在,假设发电厂过热时至少需要一万加仑的冷却液。 在当前的定义中,我们不能偶然排放冷却剂,但是仍然可以将不足量的填料传递给冷却功能。 让我们通过在函数内添加检查来解决此问题,以免意外导致反应堆开销。 您会从检查中注意到,该参数的值存在隐式依赖性。 我们可以并且应该通过定义新的Dependent Type使隐式显式。 我们称它为Coolant 。 对Coolant此定义使用一个可失效的初始化程序来确保除非存在至少一万个Coolant否则它不会存在。 现在,我们可以重新定义冷却功能,如下所示。 现在,除了所需的最小Coolant剂量外,不可能用其他任何方法调用此功能。

如何在iOS中自动检测内存泄漏

iOS开发人员面临的两个最大问题是泄漏或保留周期。 两者都可能给应用带来一些弊端,例如高内存消耗,随机崩溃,性能下降等。 因此,在Wolox,我们决定研发技术来避免这些问题,开发出功能强大的软件,并最终使开发人员的工作变得更加轻松。 什么是泄漏? 当给定的存储空间无法被系统恢复时,由于无法告知该存储空间是否在实际使用中,会发生内存泄漏。 在iOS中产生内存泄漏的最常见问题之一是保留周期。 当我们在两个或多个对象之间进行循环引用时,就会发生这种情况。 保留周期可防止释放这些对象使用的内存,即使这些对象的创建者释放了它们。 例如,如果我们有一个班级人员和一个班级公寓(如下所示) Swift和Objective-C都有一个引用计数器(ARC),负责释放未引用的内存(换句话说,就是不使用的内存)。 此过程通过计算每个对象具有的强引用来工作。 强引用将引用计数器增加一,而弱引用则根本不增加计数器(当对象的引用计数达到零时,它们会将值设置为nil)。 当实例具有零引用时,它将被释放。 但是,ARC无法检测到保留周期。 在我们的情况下,我们只有强大且交叉的引用,因此,这两个实例将永远不会被释放。 如何修复泄漏? 我们所能做的就是声明一个引用为弱引用,另一个声明为强引用,因此,循环引用被破坏了。 发现此类问题的两种常见情况包括: 案例1:关闭 情况2:委托模式 当一个对象的强引用(我们称其为ObjectA)强烈引用另一个对象(我们称其为ObjectB),而ObjectB强烈引用该闭包时,则可能发生由闭包创建的保留周期。 在下图中,我们可以看到所描述场景的表示。 情况1:可以使用`unown`或`weak`关键字来解决由闭包引起的保留周期,从而破坏循环引用。 另一方面,当未将委托声明为对委托具有强引用的弱对象时,可能会发生使用委托模式(情况2)引起的保留周期。 例如,如果我们有一个视图控制器实现了另一个对象的委托,而这个委托没有被声明为弱对象,我们将得到如下图形: 有关内存管理的更多信息,请查看以下链接:http://krakendev.io/blog/weak-and-unowned-references-in-swift 结合分析仪 在Wolox,我们使用MVVM模式使苗条的视图控制器更加有序,更小并且分开职责。 结合分析仪是我们用来检测泄漏的最早工具之一。 此过程包括评估在视图控制器中实现的绑定数量和未绑定数量之间的差异。 通过绑定,我们的意思是将视图模型的属性连接到控制器的视图出口和动作。 使用这个数字,我们可以区分发布的视图控制器和视图模型与未发布的视图控制器和视图模型。 我们必须小心,不要检测到由寿命长的对象(在应用程序的整个生命周期中保持活动的对象)引起的虚假内存泄漏,例如管理选项卡栏的视图模型。 为了做到这一点,我们有一个“注册表”来跟踪这个长期存在的对象。 该注册表是使用包含该长期对象的标识符的单例数组实现的。 另外,每次执行视图模型的绑定或取消绑定时,我们都需要注册和删除。 为此,我们还有一个带有结构数组的单例,其中包含我们注册的视图模型的数据。 此外,该类将分析是否删除了注册为“长期存在”的视图模型,该模型不应发布。 有关更多信息,请查看:带情节提要的ViewControllers中的ViewModel注入 完成registerUnbinding和registerBinding函数之后,我们可以注册绑定或取消绑定视图模型。 该方法如下: 最后,我们需要添加一个按钮来触发该工具。 实施新功能后,我们可以使用它来运行BindingAnalyzer来检查应用程序内是否存在任何泄漏。 绑定分析器工具是我们在Wolox使用的一种工具,可以产生出色的结果。 即使使用此工具,仍然有可能发生泄漏,因为每次代码库发生更改时,我们都必须手动运行该工具。 使用单元测试自动检测内存泄漏 绑定分析器工具引起的问题使我们思考如何使用单元测试自动检测泄漏。 通常,当我们添加新功能时,我们会测试其行为,但是是否会在添加新漏洞时进行测试? 在Wolox,我们将泄漏测试用于诸如视图控制器和视图模型之类的功能。 使用该技术可以省去手动检查泄漏的过程。 一种实现方法是使用Nimble和Quick。 如您所见,测试由两部分组成,第一部分负责检查视图控制器和视图模型中是否都存在泄漏。 给定一个视图控制器工厂,将创建一个引用以前模型的新控制器。 因此,它必须对视图控制器以及视图模型具有弱引用。 现在,删除与视图控制器关联的强引用并隐藏其视图。 […]

(iOS)人机界面指南_系统功能

AR(增强现实) Apple(R)发行人ARKit(Apple)的产品套件。 AR앱에서세계를세계를3차원상로로로브형식을이브형식을보브형식을다。 下载있으며있으며있으며있으며있으며있으며。。。 2.多任务 iOS上的iPad上的iPad上的产品在iPad上的下载量也将增加。 ,제든지중단로있으므로,정한정한다。다。다 。다다표시한다。 双高状态栏(이중이상태)작동하는지작동하는다。 。다른시스오디오로있다있다있다。 。다。 앱이중지실행되실행되실행되실행되알림을사용하도록다。 3.通知 도착능으능으능으메세메세메세도착도착도착를를정정정를를정를든를든있다 사잠금화면이나기기를사아래아래로스아래이프하여있다。 4.印刷 AirPrint发布文档,PDF格式的文档,PDF格式的文档,以及PDF格式的文档。 5.快速浏览 Look快速查看란主题演讲,数字,页面및PDF문서아니라이아니라지나기타미리해주는기해주는다。 邮件앱에서는지메세이콘과이름을다。 。이콘을미리보기가표시됩니다。 보리보기보를다。 6,评分和评论 。리뷰는사뷰는지말지결정하는데에이됩니다。 。이많뷰는됩니됩니됩니됩니됩니됩니됩니됩니됩니됩니됩니됩니됩니됩니됩니됩니됩니됩니됩니됩니이 사용자가사물어본물어본다。 。스트레스가용자를수행할방해하지않는다。 。가평사용자의사부정적인다있。 최소1〜2주정도의기간을다。 시스템의가평로영향으좋좋좋좋좋좋좋좋좋좋좋좋좋 7.屏幕截图 사있스크린。있있다。 iOS 11上的所有功能。 용자긱긱긱긱긱긱긱긱긱긱긱다。있다 스크린저장된다。 8. Siri Siri的照片,Siri的照片,Siri的照片,Siri的照片,Siri的照片,Siri的照片,Siri的照片,Siri的照片,Siri的照片,Siri的照片,Siri的照片,Siri的照片。 。지만이없이음성만을기위해다。 Siri모방하거나조작하지않는다。 환경에서는Siri환경에서는,마케팅이내용다。 9.电视提供商 앱을앱앱인온사싱글(SSO)하고람들에게하고하고하고있하고있다있다 싱글사인온(SSO):통합인증싱글인온인온한한한한한한들을들을들을들을들을템템템템템템템템템템템템템。 링크링크: https://developer.apple.com/design/human-interface-guidelines/ios/visual-design/adaptivity-and-layout/ [애플문서] https://zetawiki.com/wiki/%EC%8B%B1%EA%B8%80%EC%82%AC%EC%9D%B8%EC%98%A8_SSO [제타]

Fazendo下载快速格式的图像

最新图片或Alamofire图片 Olágalerinha。 Dessa vez vim mostrar算法和简单应用可用于下载iOS上的免费图像。 Para quem acompanhou um tempoatráscoloquei em 3 passos como criar uma pokedex。 Criando uma Pokedex com Swift零件:1/3 Instalando o CocoaPods medium.com Criando uma Pokedex com Swift零件:2/3 Consumindo um JSON medium.com Criando uma Pokedex com Swift零件:3/3 Mostrando nossos monstrinhos medium.com Nessa pokedex temos o列表下载口袋妖怪图片。 Eles foram feitos包含API Alamofire。 Alamofire / […]

如何创建自定义分段控件-Swift

通常,我们的设计器会创建一些不是UIKit模式的组件。 大多数时候,我们可以做出一些改变,但有时却不能改变。 今天,我将教您如何创建自定义分段控件。 首先,让我们来一个UIKit分段控件。 在大多数情况下,我们都有边框,色调颜色和区域,我们可以自定义此分段控件。 假设您要创建此组件。 您在界面构建器中没有底视图来修改或删除所选节的背景。 让我们开始吧! 注意:我不会使用IBInspectable / IBDesignable,但是如果您知道如何使用它们,则可以。 我们的CustomSegmentedControl是UIView的子类,而不是UISegmentedControl 首先,我们需要创建变量: 我们有三个私有变量,为什么要私有? 因为我们不希望其他类可以在没有updateView的情况下更改此值。 使用默认值来自定义视图的三个变量。 现在我们需要显示按钮,但是我们有一个数组,这个数组可以是无限的。 最好的方法是创建一个水平堆栈视图 。 堆栈视图使子视图具有相等的间距,而不使用任何约束。 您如何意识到我们创建了四个约束来使我们的堆栈视图充满所有自定义视图。 现在,让我们创建选定的视图。 我们希望所选视图具有相同的按钮宽度。 我们需要用相等的部分数划分视图框架。 让我们在数组中添加一些按钮,我们该怎么做? 使用我们的buttonTitles数组。 首先,我们删除按钮中的任何元素,并删除视图中的所有子视图。 我们可以从按钮标题创建一个for,并从我们的标题创建一个单独的按钮,让我们设置标题,颜色和动作也添加到按钮数组中。 在本教程中,我考虑始终选择零部分。 让我们实现这种情况,将颜色设置为索引零的按钮。 在我们的动作函子中,我们必须创建一个用于从数组按钮中枚举的for,因为我们可以访问单个按钮和数组中的索引。 首先,我们需要将按钮设置标题颜色设置为默认颜色,之后我们需要进行比较以找到单击了哪个按钮。 我们需要找到X位置,并使用UIView.animated将我们的selectorView移到该位置,然后将按钮标题颜色设置为selectedColor 现在,我们创建一个名为updateView的功能,以调用其他三个配置功能。 很简单。 我们可以创建一个便利初始化或/和创建一个传递数组的函子。 我要创建这两个。 为什么? 因为与您一起使用的是“查看代码”,我们将使用我们的init,但是如果我们要创建IBOutlet,则需要调用函数。 如果您运行代码,它应该可以工作。 记住在viewDidLoad()中调用CustomSegmentedControl

迦太基的依赖性管理策略

在与iOS和macOS开发人员进行讨论时,我意识到他们几乎所有人都知道迦太基,但是不幸的是,一些开发人员认为它仅限于carthage update命令来下载框架。 如果您只知道update作为选项,或者仅倾向于使用此选项,那么您将在本文中找到一种简单而有效的依赖项管理策略,该策略仅基于两个Carthage选项update和bootstrap 。 迦太基使用基础 迦太基工作流程基于Cartfile ,后者是开发人员和工具之间的接口。 我们在该文件中以OGDL格式添加了我们想要的所有框架。 为简化起见,我们每行通过添加其来源(Git repo,github或二进制文件)以及可选的要下载的版本来编写一个框架。 注意 :第一次添加每个框架都需要其他必要步骤(请参阅:将框架添加到应用程序)。 迦太基更新 该命令将通过解决所有依赖关系来下载Cartfile中列出的所有框架; 构建它们(如果未指示版本要求,则下载依赖项的最新版本)并更新解析文件carthage.resolved ,列出所有依赖项(甚至是嵌套的依赖项),并列出每个要下载的确切版本。 迦太基靴 此命令将完全按照carthage.resolved文件中的说明下载和构建框架。 如果文件( carthage.resolved )不存在,则此命令将执行update ,它将解决依赖关系并(重新)生成它。 战略 首先,它包括将Cartfile和carthage.resolved添加到版本控制系统(大多数情况下为Git),并排除Carthage目录及其子目录,以使存储库轻巧。 然后,所有团队成员每次需要获取所需框架时都需要使用carthage bootstrap (例如,当切换到不包含相同框架版本的新分支或包含新框架的分支时)。 最后,仅在确实需要更新框架并将这两个文件添加到commit (当然,在测试和/或调整实现以适应更改之后),才使用carthage update 。 一般 可以将相同的策略应用于其他依赖项管理工具,例如: Cocoapods ,带有pod install , pod update以及Podfile和Podfile.lock Bundler ,具有bundle install , bundle update以及Gemfile和Gemfile.lock 并且可能是其他同类工具。 本文的其他版本:法语 Github项目: 迦太基

使用React Native进行移动应用开发的利弊

React Native基本上是社交媒体巨头Facebook开发的框架。 它实际上是一个开源框架。 这个框架利用React架构模式来开发与iPhone,Android和其他应用程序相同的家庭用户界面。 Facebook通过React Native开发自己的智能手机应用程序。 好吧,人们可能会认为,因为它是Facebook的框架,所以关于它的一切都必须是好的。 但是,由于这个世界上没有什么是完美的,所以这个框架也有自己的缺陷。 下面给出了使用React Native的利弊。 优点 关于React Native最好的部分是它的结构。 框架的每个部分都可以顺利访问。 这有助于开发人员有效地使用它,或者毫无疑问地使用它。 有许多组件可以很容易地应用。 这使得开发过程非常快。 实际上,React Native的最大优势之一就是它是Facebook的产品。 该框架正在不断升级。 此外,引入了这些更新,以保持编码人员的实时体验,以提供更好的便利。 React Active缩短了应用程序开发时间。 因此,可以始终控制React Active应用程序开发的成本。 此外,该框架还允许Javascript编码人员为多个操作系统开发应用程序。 由于他们只需要基本代码,因此这成为可能。 React Native是满足动画播放或相关开发需求的最佳工具之一。 实际上,这些任务中最艰巨的任务可以60 fps的速度执行。 React Native应用程序以可靠和稳定的表现而享有盛誉。 在开发新应用程序的同时,还可以通过React Native更新已经存在的本机应用程序。 就更改而言,React Native非常用户友好。 一个引入的更改可以轻松执行或更新。 缺点 尽管React Native的负面影响要少得多,但还是有一些。 首先,开发的应用程序可能是可靠或安全的,但它们的性能并没有达到预期的最高水平。 由于有这么多现成的组件,因此实验范围变得很小。 React Native应用程序开发需要更少的本机代码。 尽管这是许多人都认为的优势,但是,这也是事实,对于完整的应用程序开发,在很多情况下本机开发也是必需的。 在将插件与应用程序集成时,这是必不可少的。 这里要提到的是,在使用React Native开发应用程序时,用户必须遵守Facebook的许可条款和条件。 尽管这并不是一个大问题,但是,任何与专利相关的问题都可能要求许可更新,因此需要谨慎。 如上所述,地球上的任何事物注定都有其自身的利弊。 React Native也是如此。 但是,最重要的部分是它的持续流行。 这是一个用户友好的工具,这是开发人员如此喜欢它的首要原因。

成为iOS开发“风行一时”的我的旅程。

大家好,如果您像我一样,那么您对编码世界还是一个新手。 对于那些不是那么新的人,也许这个故事会激起一些怀旧的回忆。 C4Q徽标。 去年九月(2017),我在名为Queens for Queens的组织中启动了访问代码研究金,该组织也被学生称为C4Q,现在称为Pursuit。 在那之前,我刚大学毕业,并不真正知道我的职业方向。 我从哥哥那里听说过C4Q,因此决定看看。 从表面上看,他们的任务看起来非常好并且令人鼓舞,所以我决定签约并试一试。 我经历了一个非常严格的过程,其中包括现场技术和行为面试,以及最终以“最终考试”结束的javascript讲习班,以了解我们如何很好地掌握代码。 我不会撒谎,有一段时间我非常担心自己不会加入。不是因为我不认为自己可以削减它,而是因为我真的很想进入程序。 每天,我都会焦急地检查我的电子邮件是否有响应,在经历了数次令人烦恼的神经困扰之后,我终于收到了他们的回复。 我已经被他们的iOS开发程序接受了!!! 对我来说,这是一个巨大的胜利,但是我知道,这仅仅是漫长道路的开始。 现在,我要说这是我的课程非常幸运,我们有一位很棒的教练,而ta也同样出色。 更不用说我的同龄人了,我们都是一群陌生人,但是很快就变成了一个紧密联系,非常支持家庭的家庭。 说到家庭,我的兄弟(同行业)在整个过程中都非常支持我。 艰难的爱情和一切,哈哈! 该程序从我们开始学习Swift的基础知识:let,var,字符串,int,数组,作品! 考虑到我从来没有在javascript讲习班之前真正编写过代码,我会承认这令人望而生畏。 每天都有一场学习和理解摆在我面前的代码的战斗。 几周后,我们掌握了有关基础知识的知识并开始了逻辑学,这是我做过的最难的部分之一。 仅仅把头放在如何构建和组织逻辑代码上是很困难的,但与此同时,当我开始工作时,这是非常有意义的。 跳过几周,我们即将从Swift操场毕业到实际的XCode项目! 就是这样,我们将初体验情节提要和制作应用程序,尽管相当简单,但仍然需要应用程序。 我非常激动和焦虑,但是我走了这么远,我现在并不想停下来。 我毫不犹豫地投入工作,并通过所有的成功和失败来拥抱这个过程,并相信我有很多失败。 学习成为开发人员的一部分是学习如何处理挫折和失败。 每一次挫折和失败都是一个学习的机会,如果您不学会以这种方式看待它们,学习将不可避免,并且总是会成为艰巨的战斗。 再快一点,我们的团队又选了一位超级才华的教练。 大约是在这个时候,我开始与同学一起进行小组项目。 让我告诉你,如果您认为自己学习编码和编码很困难,那么与一组开发人员一起工作是一种新的挑战,充满挑战并能自给自足。 我必须非常快速地学习如何谦逊自己,而不是占有我编写的代码。 我的一位讲师说的一句话会永远陪着我:“当您在一个小组中工作并向小组贡献代码时,代码属于该小组,这就是与小组一起工作的意义”。 我最终做到了C4Q的简称“ hackathon”。 我们都提出了应用创意,人们投票支持他们想要开发的应用。 这个过程历时3天,我们的团队不得不从头开始构建一个完整的原始应用程序。 如果我认为在常规的分配小组项目上工作很辛苦,那将是一大挑战。 直到那时,我还没有意识到我的git技能真正需要多少工作。 至少可以说,我还和一个团队一起工作,该团队功能异常严重,但最终我们都做到了。 在黑客马拉松结束时,我们所有人都将应用程序演示给了来自实际开发人员世界的评审团。 这是我第一次真正的兴趣,是在公开场合与同学以外的其他人谈论我们开发的应用程序,它的功能以及回答更有经验的开发人员的棘手问题。 阶段应用徽标。 现在,让我们跳过大约一周左右的时间,终于到了我们的顶点项目的时候了。 黑客马拉松的概念几乎相同,只是规模更大。 我们能够选择理想中的合作对象,而现在我们都对与谁合作的对象有了很好的了解,我很幸运地加入了一个没有很多自负的团队它。 作为一个小组,我们讨论了一些应用程序的想法和名称,直到我们都同意应用程序“阶段”(此处显示徽标)。 Phase是一个社交应用程序,可让用户创建称为“旅程”的相册,每个帖子均称为“阶段”。 它从头到尾着重于各个旅程的整个过程。 此外,除非他们想关注所有内容,并且与其他竞争对手相比,它可以使用户更好地组织图像内容,否则用户也不会被迫在其供稿中查看某人的所有内容。 四周后,在其中将近140个文件和将近70,000行代码的情况下,我们将在这里的PayPal / Venmo总部在更大的评委和更大的人群(超过100人)面前展示我们的应用程序在曼哈顿! 谈论一个很高的要求。 […]