Tag: 编程

我与React-Native关系的3个原因

我担任iOS开发人员已有一段时间了,以前的大部分文章都涉及到iOS平台的各个方面。 但是,我必须承认一些事情……我一直在与React-Native发生婚外情,甚至“更糟”的事情-我对此感到非常好。 如果您不知道什么是React-Native,则应访问React-Native网站。 React Native可让您仅使用JavaScript构建移动应用程序。 它使用与React相同的设计,使您可以从声明性组件组成丰富的移动UI。 让我告诉您有关我与React-Native关系的三个原因。 生态系统 当我有机会为项目开发Web面板时,我第一次被介绍给React。 看到事情如何在网络上运行并了解有关Redux之类的架构的更多信息,真是很有趣。 当我发现React + Redux的知识可以轻松地通过React-Native转移到移动开发中时,我感到非常高兴。 如果情况需要,这可以使您将技能应用到项目的各个部分。 我并不是说您将像在特定平台上的“专家”一样有效,但是您可以肯定地帮助您的队友并为项目增加价值。 反馈回路 如果您是TDD / BDD的忠实拥护者,或者只是觉得需要测试编写良好的代码,那么您可能会知道,使用这种方法可以使反馈周期短是真正的好处。 我喜欢我可以在每个文件保存上运行测试的事实,知道结果只需几秒钟。 这使我感到自己使用的工具适合我的工作风格,并可以帮助我以自己喜欢的方式编写代码。 富有成效 来自一个不小的iOS项目,我习惯了很长的构建时间,事实是,有时甚至切换到测试目标都需要我重新构建项目。 我参与的React / React-Native项目虽然规模不大,但是仍然…事实上,您可以看到由于热重装而立即发生的变化,而您唯一需要等待的就是Typescript编译器,这极大地提高了生产率。 摘要 我真的很喜欢React / React-Native适合我的工作方式的方式。 这些很棒的工具肯定会帮助您完成工作。 我必须说,对于RN允许您在平台之间重用大部分代码这一事实,我并没有那么炒作。 当然这是一件很棒的事情,我当然不会放弃,但是我真正喜欢RN的一件事是我从中使用它构建事物以及使用开发人员创建RN附带的工具的方式获得乐趣。心里。 这并不是要把一切都留给React-Native。 学习任何新的框架或语言将有助于您了解自己喜欢的内容,并与各种平台上使用的模式取得联系。 也许它将激发您找到改善其他项目工作流程的新方法。 不要将您的心爱的语言或框架附加到自己的头上,并时不时尝试其他方法-作为开发人员,它肯定会使您受益。 您可以在 www.eliaszsawicki.com的 博客上找到更多我的帖子。

作为iOS开发人员实习生的12周-第三周

我深入研究了Chris Eidhof的“ Advanced Swift”,Ray Wenderlich团队的“ RxSwift”,并开始在我的第一个大型应用程序屏幕上工作。 Advanced Swift使我对Swift语言的工作方式有了更好的了解。 例如,您可以遍历数组和字典的原因不是因为它们是数组和字典。 因为数组和字典符合Sequence协议,所以可以迭代数组和字典。 序列 -一系列相同类型的值,可让您遍历这些值 遍历序列的最常见方法是for循环 为了符合序列协议,请提供一个返回迭代器的makeIterator()方法 为了符合序列协议,必须实现返回迭代器的makeIterator方法。 迭代器-一次生成序列的值,并在遍历序列时跟踪其迭代状态(for循环) 当然,迭代器必须符合迭代器协议。

iOS版Firefox Focus中的错误修复

大多数浏览器上的“私人浏览”并不全面,也不易于使用。 焦点是免费的,永远存在且始终在您身边的下一个级别的隐私-因为它得到了Mozilla的支持,Mozilla是为您的Web权利而战的非营利组织。 (摘自App Store中的应用说明) 它的功能之一是,如果您不想从Safari切换,仍然可以在Safari中使用Firefox Focus功能(请按照以下步骤操作)。 虫❌ 问题在于,使用前后导航后,URL栏中的搜索文本与实际搜索不匹配。 让我们来看一个例子: 搜索“监护人” 搜索“ mozilla” 按回 搜索“ firefox” 按回 搜索页面显示 “监护人”请求的结果,但URL栏包含“ mozilla”而不是“监护人”。 修复🔧 问题的作者在那里留下了注释,表明该问题可能存在于SearchHistoryUtils堆栈中。 它帮助我开始了对该问题的调查。 我找到了SearchHistoryUtils类,其中包含两个布尔属性。 isFromURLBar isNavigating 和四个功能: pushSearchToStack(with searchedText: String) —当用户发出新的搜索请求时,此函数将搜索推入堆栈。 pullSearchFromStack() -> String? —此函数不会从堆栈中弹出搜索,而是返回当前搜索文本(如果存在)的值。 goForward() —更新堆栈对象的isCurrentSearch值。 goBack() -与#3相同 当我分析代码时,我取消了pullSearchFromStack , goForward和goBack函数,因为它们并未真正处理堆栈更改。 因此,我开始调试pushSearchToStack函数。 我调试了几个测试用例,然后让我们看一下我的发现。 因此,我几乎重现了问题中描述的错误,然后发现了问题: 当最后一个搜索不是当前搜索(例如,在执行第一个“返回”用户操作后的堆栈中),并且用户进行了新搜索时,最后一个搜索不会被新搜索覆盖(请查看上表中的红线) )。 这就是为什么当用户返回时,URL Bar会采用旧的搜索文本,那时候甚至不应该将其放在堆栈中。 让我们看一下pushSearchToStack函数的一部分伪代码: 让我们分解上面的代码: 它声明一个空堆栈currentStack 。 它将currentStack的值设置为全局状态searchedHistory值的值。 然后,它遍历堆栈中的每个搜索,并将isCurrentSearch属性的值设置为false 。 […]

我参加了编码训练营—现在怎么办?

上周我打了个电话,被问到:“从编码训练营毕业以来,您学到了什么?”我开始对此进行反思,并考虑将时间和学习重点放在优先位置的方式。 如果您正在考虑参加编码训练营,或者刚从编码训练营毕业,或者准备从编码训练营毕业,那么我希望本博客对您有所帮助。 我将讨论帮助我制定“后训练营”计划的关键事项,并弄清楚什么有效,哪些无效。 确定优先事项 在12月完成训练营后,我知道我必须开始找工作,但不知道如何确定几项工作的优先次序,并且有几个问题: 我应该建立自己的应用程式吗? 我自己的应用应该多久才能在App Store中出现? 我应该开始联网吗? 每周/每月我应该参加几次聚会? 我应该练习/复习哪些iOS技能? 我应该在白板练习/算法上花费多少时间? 我应该支付任何资源(Ray Wenderlich,Udemy,Udacity,GitHub,Big Nerd Ranch)吗? 我应该多久向前任老师寻求帮助? 如您所知,毕业后一周内我有很多思考。 实话实说,我花了一个月的时间来思考这些问题的答案。 以上所有问题的最重要答案是: 您需要更好地编写代码 。 归根结底,我的首要任务是要更好地开发iOS。 一旦确定了专注于改进代码的第一要务,我便为自己制定了一些迷你目标。 弄清楚(最重要的)什么是自己优先的。 继续使自己适应这一优先事项! 设定CCR(清晰,具有挑战性,合理)的目标 一旦了解了自己的优先级,便为自己设定了一些CCR目标。 我从作为Kunskapsskolan老师的那一天起就想到了“ CCR”的想法。 CCR代表“清晰,具有挑战性和合理性”,我每天都会用这些词来设定最终目标,中等目标和日常目标。 即使在今天,我仍在评估今天早上为自己设定的目标,即将我的最新应用程序推送到App Store(今天不会发生,但可能要到下周吗?)。 清楚了吗? 是的 有挑战性吗? 绝对,我至少还需要完成三个功能。 合理吗? 哎呀! 我无法在阵亡将士纪念日周末建立三个新功能。 因此,让我们讨论一下我的目标: 最终目标:获得iOS Developer的职位。 长期目标:在App Store中投放众多优质应用。 中目标:每周学习有关iOS开发的新知识。 每日目标:提交代码! 显然,从新兵训练营毕业后,我的目标是找到一份工作,但是我如何为自己做到这一点设置道路? 我为自己设定了一个目标,即每个月在App Store中放置一些内容。 它给了我30天的时间来提出一个想法,并将其贯彻到底。 我花了30天的时间来考虑我想学习和使用的框架。 它给了我30天的时间来使用UI,并弄清楚什么有效,哪些无效。 应该注意的是,这个每月应用目标与否定因素有关。 首先,我太专注于在App […]

关于圣诞节和新年虫子的故事

你信不信魔术? 当然不是-这只是违反逻辑! 程序员是认真负责,受过良好教育的人,具有现实的眼光。 好吧,你小时候也不喜欢童话,是吗? 好的,我不会为您回答。 请给自己喝杯茶,剥橘子,看着窗外的雪花,然后继续阅读这个故事。 您将要读的是一个关于恶虫的故事,它多次破坏了圣诞平安夜和新年前夜。 它确实设法实现了其险恶的计划,但是幸运的是,在每个真实的童话故事中,邪恶总是被善良所反对。 圣诞树病毒 1987年12月17日,当时位于西德的克劳斯塔尔工业大学的一名学生,当时是一名初学者,他对他的朋友们产生了巧妙的圣诞节祝福。 他给他们送了一棵圣诞树! 当然,他没有在森林中砍伐它,甚至没有在商店里买过它。 他是程序员,还记得吗? 他只是用REXX脚本语言为VM / CMS编写了一个程序,该程序将在屏幕上绘制一棵漂亮的圣诞树并打印一些温馨的词。 图1 —圣诞树蠕虫 我们故事的主人公当然很好,但是Evil Bug干预了,使网络过载,并利用自我复制的圣诞节程序瘫痪了全世界两天的私人电子邮件网络IBM Vnet(链条是这样的:大学网络-EARN- BitNet-IBM Vnet)。 该英雄被怀疑是反英雄,他的感人问候是蠕虫。 程序员的恶意意图从未得到证明,但是Evil Bug确实参与了这个故事。 空前的慷慨演出 人们通常在圣诞节前夕和新年前夜交换礼物。 圣诞树下包装精美的盒子或壁炉旁悬挂着圣诞袜的可爱纪念品–这就是传统的圣诞节和新年礼物的样子。 但是,惊喜特别令人愉悦。 亚马逊是最早的互联网服务之一,每天有成千上万的各种商品买卖。 挑选礼物的理想场所! 这就是网站访问者在2014年12月12日所做的事情。巨大的兴奋是因为成千上万的商品以仅1便士的奇妙价格出售(来源)。 买家对亚马逊提供的如此精美的圣诞礼物深表谢意,买家热情地将他们的购物车装满。 同时,Evil Bug正在看着和嘲笑,期待着卖方的反应,而卖方对他们遭受的巨大损失一无所知。 该错误隐藏在负责同步在线商店价格的RepricerExpress软件中。 该软件使卖方能够迅速响应同类产品的价格波动,从而促进了竞争。 恶虫做了什么? 当它只经过开发和测试时,便潜入了RepricerExpress,直到直到……一位受困于节日前动荡的卖家意外地为所有股票设定了一个价格(1美分)后,才潜入RepricerExpress。 该软件将该价格作为最低价格,并相应地降低了其他卖家的同类产品的价格。 这种行为与以下事实有关:开发UI时,软件作者未实现允许卖方指定单个最低价格的功能。 更重要的是,价格将在一定间隔内自动更新。 该错误已在软件的后续版本中修复。 图2-固定用户界面(带有新添加的“您的最低价格”列) 漏洞的一天将被亚马逊卖家记住。 那天,他们损失了数千美元,许多人几乎破产了(来源)。 但是,对于亚马逊采取的迅速行动,该行动设法取消了对受影响物品的大部分订单,最大的在线商店的声誉将受到严重损害。 RepricerExpress开发人员在其官方博客上发布的声明中为该错误表示歉意。 苹果VS新年 还记得电影《格林奇如何偷走圣诞节》吗? 似乎在考虑制定攻击Apple设备的计划时,Evil Bug便将其作为灵感的来源。 2016年2月,Apple用户发现了一个有趣的错误。 社交网络上流传着一个传说,说如果您在iPhone或iPad上将日期更改为1970年1月1日,然后重新启动,系统将完全崩溃,并留下带有Apple标志的积木。 […]

Swift#1中的Euler项目

我之前曾接受过Google的采访,但失败了。 面试官指出了我的缺点,算法和对OS级别的深刻理解。 我相信许多开发人员可能会想为什么我们应该学习这些东西。 我们在日常工作中几乎不能使用它们。 但是,我从另一个角度考虑。 在我的工具集中拥有这些技能会很好。 他们可以帮助我思考解决方案并解决难题。 所以从现在开始,我有一些业余时间来学习新事物。 我决定在Euler项目上玩算法难题。 问题 第一个问题称为3和5的倍数。 如果我们列出所有低于10的自然数,这些自然数是3或5的倍数,则得到3、5、6和9。这些倍数的总和为23。找到1000之下3或5的所有倍数的总和。 解 天真的解决方案是这样的: 让过滤=(1 .. <1000)。过滤器{ $ 0%3 == 0 || $ 0%5 == 0 } filter.reduce(0,组合:+) 我将其编写为两个表达式而不是一行,因为否则该表达式对于Xcode 7.3.1而言过于复杂。 但是该解决方案不可重用。 如果我们还有更多适用规则要怎么办? 例如,相反,我们想要3、5或7的倍数。 我试图编写一些帮助功能。 第一个函数是Int的扩展。 它检查一个整数是否可被另一个整数整除。 扩展Int { func divisibleBy(num:Int)-> Bool { 返回num%self == 0 } } 然后另一个函数检查给定的整数是否满足其中一个规则。 在这个问题中,规则是3的倍数和5的倍数。这将是Int-> Bool类型的函数。 我使它通用。 func满足条件(目标:T,规则:[T-> Bool])-> Bool { […]

关于设置的一点

1个 我将深入探讨Swift编译器内部。 我认为最好做一点笔记并描述整个旅程的步骤。 目前,我对Swift或LLVM的内部知识一无所知,但对我在大学期间学到的编译器有一些常识。 因此,这些说明对将要跟随我并了解快速编译器实际工作原理的每个人都是有用的。 我将在每个步骤之后写一个简短的摘要。 而且,我认为从公开准备步骤开始非常重要,以便在我的机器或OS发生问题时能够重现环境。 步骤1.获取源代码并进行一些调整 我从探索swift.org开始。 有一个名为“编译器和标准库”的页面,其中包含编译器体系结构的简要概述以及指向主存储库的链接。 可通过github获得源代码。 README.md包含使用Ninja和CMake设置和构建编译器以及创建.xcodeproj的所有信息。 我选择了后者。 〜$ utils / build-script -x 它可能会运行很长时间。 在构建过程中,我试图准备自己阅读swift.org上的所有可用文档。 它指出编译器由几个模块组成,每个模块代表下一个抽象级别:解析,语义分析,SIL生成,优化,最后是LLVM IR生成阶段。 我将重点介绍官方文档中缺少的内容。 生成的Swift.xcodeproj可以在build / Xcode-DebugAssert / swift-macosx-x86_64 /子目录中找到。 当我第一次打开它时,Xcode用一个模式提示向我打招呼: 但是我可以完成任务,并通过一个简单的步骤解决了该问题: 我做了什么? 我为尚未存在的目标BUILD_ALL添加了构建方案,并设置了可执行文件以使用lldb进行调试: 太容易了。 因此,是时候启动并尝试调试可执行文件了,不是吗? 设置断点,按Cmd + R并… 程序以退出代码结束:0 执行并没有在我的断点处停止。 嗯当然了 我尚未将源文件传递给进程。 使用/path/to/working/dir/A.swift和…调整启动时传递的参数 。 程序以退出代码结束:0 在这里我卡住了。 步骤2.探索执行流程 在继续之前,让我们深入了解swiftc的工作原理。 我的意思是,当您通过命令行调用swiftc并将其传递给源文件时,它会做什么。 你知道吗? 我也不。 我认为这非常简单:迅速的编译器读取输入参数,实例化环境,然后启动lexer,解析器,AST分析器等 。 它的工作方式是这样,但前提是您传递了命令行参数的特定顺序。 通常,它只是设置并启动其他程序来编译,分析和链接可执行文件。 […]

婴儿快步进入第4部分; 位置和别针

让我们面对现实吧,人们迷路了,找不到自己的路,而且由于智能手机的发明,没有人随身携带实物图。 这是我迅速完成的一个小应用程序,它可以找到用户的位置并显示瑞典斯德哥尔摩的名胜古迹。 无论如何,实施都不是最佳实践,但在当时达到了我的目的。 注意:例如, 您必须将模拟器中的自定义位置设置为瑞典斯德哥尔摩的位置。 lat:59,312251和long:18,0409才能看到图钉。 现在让我们看一下代码(我将代码分成三部分,但实际上只是一个快速文件): 代码的第一部分是找出用户所在的位置 与上面相同的代码,但连接到UI按钮以查找我的位置 最后一部分是显示用户的位置,应该显示的地图的大部分,注释和非常基本的缩放功能。 要使位置服务正常工作,还必须将NSLocationWhenInInUseUsageDescription添加到info.plist文件中。 Github仓库: https : //github.com/cc-lemon/location_and_annottations/blob/master/map%20tests/ViewController.swift 资料来源: 关于MapKit的一般信息:http://www.techotopia.com/index.php/Working_with_Maps_on_iOS_8_with_Swift,_MapKit_and_the_MKMapView_Class Ray Wanderlich在MapKit上的精彩教程https://www.raywenderlich.com/90971/introduction-mapkit-swift-tutorial

如何保存和加载自定义对象?

通常,我们使用NSKeyedArchiver序列化对象并将其写入文件。 相应地,NSKeyedUnarchiver用于从文件中获取对象。 NSKeyedArchiver的界面是这样的: +(BOOL)archiveRootObject:(id)rootObject到File:(NSString *)path; NSKeyedArchiver是一个NSCoder。 rootObject应该符合协议NSCoding。 @协议NSCoding -(void)encodeWithCoder:(NSCoder *)aCoder; -(id)initWithCoder:(NSCoder *)aDecoder; @结束 让我们举一个例子: 例如,现在我们有一个customObject: @interface CustomObject:NSObject { NSString * mStringValue; int mIntValue; BOOL mBOOLValue; } @属性(非原子,保留)NSString * stringValue; @property(非原子,赋值)int intValue; @property(非原子,分配)BOOL boolValue; @结束 它符合NSCoding,因此我们需要在.m文件中实现这两种方法 #define kEncodeKeyStringValue @“ kEncodeKeyStringValue” #define kEncodeKeyIntValue @“ kEncodeKeyIntValue” #define kEncodeKeyBOOLValue @“ kEncodeKeyBOOLValue” #pragma标记-NSCoding -(void)encodeWithCoder:(NSCoder *)aCoder { [aCoder encodeObject:self.stringValue forKey:kEncodeKeyStringValue]; [aCoder […]

RedPotion入门可加快iOS开发

在上一教程中,我向您介绍了用于构建iOS应用程序的RubyMotion。 RubyMotion还支持其他平台,包括Android,但是在本教程中,我们将继续学习iOS开发。 本教程将向您介绍一个名为RedPotion的框架,该框架将大大改善您的iOS开发体验。 在本教程中,我们将开始构建一个利用表格屏幕显示事件列表的应用程序,特别是Calagator.org中的事件。 什么是RedPotion? 我喜欢将RedPotion视为“ iOS开发的轨道”。 它是RubyMotion的一些最佳工具的集合,提供了简单,直观的API和DSL工具包,可完成常见任务并减少通常在iOS应用中编写的样板代码的数量。 RedPotion用直观的术语和简单的方法名称抽象了许多iOS特定的术语和详细的方法名称。 例如,iOS应用程序将具有以下方法: 应用程序:didFinishLaunchingWithOptions: applicationDidBecomeActive: tableView:cellForRowAtIndexPath: 在RedPotion中,这些相同的方法可以定义为: 负载 on_activate table_data 这只是RedPotion使iOS开发更简单的许多方式中的几个示例,更像您作为Ruby开发人员所习惯的那样。 要了解有关RedPotion的更多信息,请访问文档:http://docs.redpotion.org/en/latest/ RedPotion入门 要开始使用RedPotion,您需要安装gem: 创建画面 在iOS中,UIViewControllers负责协调您在屏幕上看到的内容。 在RedPotion中,这些屏幕称为“好”屏幕。 RedPotion提供了许多不同的屏幕类,以帮助您避免构建这些公共屏幕所需的样板代码。 其中一些示例包括表格,导航栏,标签栏,地图,网页屏幕等等。 让我们从创建一个显示事件的表格屏幕开始。 为此,我们将使用RedPotion命令行生成器。 如果您遇到任何问题,请随时发表评论或在Slack中找到我们。 我们将继续扩展此应用程序,并在以后的教程中探索更多主题。 您可以在GitHub上找到我们Calagator应用程序的源代码。