Tag: 编程

面向协议的编程简介

在过去的几年中,面向协议的程序设计已经获得了很大的关注,并在Swift社区中成为流行语。 有些人喜欢它,有些人讨厌它,但实际上是什么呢? 应该解决什么问题? 它与我们钟爱的面向对象编程有什么关系? 面向协议编程不是竞争对手,也不是面向对象编程的替代品,尽管它的名称可能暗示其他含义。 这是思考非常具体的问题集的一种方法,可以帮助您创建灵活,可维护和易于阅读的代码。 应该将其更多地视为对面向对象方法的补充(实际上,面向对象编程已经在面向协议编程中纳入了许多中心思想)。 我们将首先研究协议(或接口,在许多其他语言中称为接口)如何帮助我们进行封装和信息隐藏。 看一下Car和Carrier类的以下示例: 车类{ 变量位置:CGPoint var isLocked = true 初始化(位置:CGPoint){ self.position =位置 } 公共职能转移(x:CGFloat,y:CGFloat){ self.position.x + = x self.position.y + = y } 公共功能锁(){ self.isLocked = true } 公共功能unlock(){ self.isLocked =否 } } 运营商类{ 变量位置:CGPoint var loadingCars = [Car]() 初始化(位置:CGPoint){ self.position =位置 } 公共职能转移(x:CGFloat,y:CGFloat){ self.position.x + = x self.position.y […]

如何准备在Facebook进行技术面试

自启动iOS面试计划以来,我有机会与许多有兴趣在Facebook工作的学生一起工作。 结果,我对他们的招聘过程产生了浓厚的兴趣。 与Google和Amazon类似,他们的采访“循环”以其冗长而详尽的经历而闻名。 我最近访问了他们在西雅图的新办公室,就他们如何建议候选人准备技术面试进行非正式讨论。 本文提供提示,注释和建议。 行为要点 参加Facebook的采访活动时,我的目标是掌握最新技术,并在指导他人时微调我的方法。 我很高兴学习他们的过程从三个方面进行评分。 行为阶段旨在了解候选人。 这包括优点,缺点和目标。 突出的是他们强调寻找能够证明自己如何从失败的项目或处于危险中的项目中恢复过来的人。 这些事件揭示了候选人的态度,行为和外貌,而不仅仅是提供标准的样板反应。 Facebook寻求能够表现出流行的快速失败心态并且不怕冒险的人。 最佳脚步向前 重点是看到他们的技术面试过程的现场演示,演示者/开发者在100多人的观众面前白板解决方案。 在Facebook实际的5到6个小时的采访中,大约一半的时间将花费在完成编码挑战上。 结果,强调了候选人利用时间发挥自己的最大作用。 挑战 在Facebook上,给候选人约45分钟的时间来解决每个编码问题。 考虑到时间限制,他们建议通过提出正确的问题来给人留下深刻的印象,然后在优化设计之前继续实施蛮力方法。 只要您能够详细说明它们的性能,就可以接受使用特定API或语言功能解决挑战的方法。 为了说明这一点,让我们重新讨论在创建算法以检测字符串中的唯一字符方面的代码挑战。 签名如下: //挑战:编写一个函数来确定输入的String(例如元素)是否包含所有唯一字符。 功能 isStringUnique (元素: 串 )-> 布尔 { //代码在这里。 } 与大多数代码一样,有许多可能的方法。 在本文中,我回顾了如何通过应用蛮力方法解决该问题,然后继续优化代码,使其在线性时间(O(n)或更佳)下运行。 没有讨论的是纯粹使用本机Swift API或语言功能来解决它​​。 有趣的是,这种看似简洁的解决方案也满足了我们的要求: 功能 isStringUnique (_ s: 串 )-> 布尔 { 返回s.count == 组 (s).count } 乍看之下,代码看起来很棒,但确实是最佳答案吗? 更重要的是,考虑到典型面试的压力,人们是否有能力证明或否认其效率? 现在的课程是-较少关注语法,而是通过证明您的方法来努力展示您的知识。 系统设计 […]

Xcode调试技巧和窍门— WWDC 2018

调试是整个软件开发过程不可或缺的一部分。 一个好的程序员应该具有高效的调试技能,以便从长远来看编写无错误的代码。 通过本文,我们将熟悉通过LLDB命令进行的Xcode调试,从而避免了每次修改都需要重新编译代码的麻烦。 提示1: 表达命令 有效地利用expression命令并以根本不需要重新编译代码的方式配置断点。 如果要在命中断点时撤消任何代码,请在Xcode控制台中使用expression命令。 在Xcode控制台中,在下面的命令中输入要执行的代码。 表达式“要评估的代码行” 断点也可以配置为通过在编辑断点选项卡内添加相同的表达式命令来自动完成。 使用expression命令在调试之间插入代码。 在下面的示例中,文本的原始值是“商业新闻版块”。 在控制台中使用expression命令可以修改文本字符串。 什么时候使用? 如果需要查看更复杂的数据或更改程序数据,则可以使用常规的“表达式”命令。 它在调试时接受一个表达式,并在当前选定帧的范围内对其求值。 提示2:符号断点 符号断点非常强大,可以将其添加到名称与断点符号匹配的任何方法中。 开发人员无需担心方法的签名或方法所属的模块。 如下例所示,在断点的符号字段中添加要为其触发断点的方法名称。 当[UILable setText:]之类的目标C格式方法在符号断点中添加其名称时被触发。 在下面的示例中,该行触发了断点。 cell.title.text = getTextForEachSection 在这种情况下,当遇到断点时,我们将开始查看汇编代码,因为我们没有UIKitCore的源代码。 如果您使用的是系统框架的汇编代码,则不必担心,因为我们可以使用伪寄存器检查传递给setText函数的参数。 伪-调试器提供的寄存器可以查看寄存器保存的参数。 $ arg1 —我们可以看到目标c消息的接收者 (SEL)$ arg2 —选择器。 (SEL)是必需的,因为LLDB不知道这些参数的类型。 $ arg3 :第一个参数传递给函数 什么时候使用? 修复控制台中的自动布局警告(如UIViewAlertForUnsatisfiableConstraints)和布局相关的警告(如UICollectionViewFlowLayoutBreakForInvalidSizes)。 提示3:向断点添加条件 当更多的对象具有与断点匹配的符号时,可能会出现频繁击中符号断点的情况。 我们可以通过添加一个仅在满足断点条件时才触发断点的条件来避免这种情况。 秘诀4:一杆断点 一个临时断点,仅在其触发之前存在,然后将其自动删除。 在击中一个击球断点后,可以使用它激活任何其他断点。 断点集-一键式true –name“-[UILabel setText:]” 在上面的示例中,仅在击中一个镜头断点后才激活符号断点“ setText”。 提示5:跳过代码行的执行以简化调试。 在许多情况下,我们希望通过跳过一些代码来节省调试时间。 我们可以通过要求调试器跳过代码来做到这一点。 […]

移动应用程序开发的五种流行编程语言

随着时间的流逝,移动技术正在迅速发展并影响着全球范围内的各个业务部门。 建立成功的应用程序开发过程需要适当的市场研究,资源丰富的规划和策略,预算等。 但是,开发人员用来构建移动应用程序的编程语言是移动应用程序开发项目中最关键的方面。 尽管看起来似乎只是选择一种语言并使用它,但是它远远超出了此范围。 选择语言之前,您必须问自己几个问题– 哪种语言可以使您的应用程序兼具功能性和高度兼容性? 哪种语言与现代移动平台最同步? 充分利用所选编程语言的最佳方法是什么? 找到这些问题的答案后,您可以从以下最流行的编程语言中进行选择,以用于移动应用程序开发。 5种流行的编程语言 的JavaScript JavaScript是用于应用程序开发的最佳编程语言之一。 这种广泛认可的语言用于应用程序开发和Web浏览。 JavaScript已成为应用开发中最常用的编程语言,因为它可以轻松地与各种平台一起使用。 该语言易于使用且易于完全控制。 所有开发人员都没有用于JavaScript的固定标准,这为不同平台之间的差异留出了很大的空间。 爪哇 Java是用于移动应用程序开发的另一种广泛的编程语言。 就Android或iOS移动应用程序开发而言,Java无疑是最受欢迎的编程语言。 代码的可重用性和可移植性使其成为最简单的选择之一。 Java使构建代码可以在多个环境,浏览器,虚拟机和不同平台中运行。 它具有巨大的开源支持,其中包含许多库和工具,可在应用程序构建过程中为开发人员提供帮助。 它还可以保护开发人员免受本机代码固有的问题,例如错误的指针使用,内存泄漏等。 蟒蛇 Python已经成为一种增长的编程语言,并且没有消失的迹象。 它可以在Web应用程序,桌面应用程序,网络服务器,机器学习,媒体工具等中找到。 Python的语言基于简单性。 它强调以易读性为重点的明确性和紧缩性。 对于学习者来说,这是一门很棒的语言,并且是理解程序开发复杂性的门户。 Python可以很容易地用于从零开始为Android和iOS软件制作移动应用程序。 的PHP 对于需要访问数据库的应用程序,PHP是推荐的编程语言。 最好用于命令行脚本,服务器端脚本和编码应用程序。 这种灵活的编程语言可以支持面向对象的开发,但无需特别关注。 作为一种开源语言,它一直在被开发。 这是用于创建电子商务应用程序和内容丰富的应用程序的绝佳语言。 此外,它易于学习,与平滑集成格外兼容。 迅速 Swift是移动开发领域的潜在游戏规则改变者。 它是由Apple创建并于2014年引入的。该语言专门设计用于iOS和OS X平台。 Swift具有开源的优势,并且非常易于学习,特别是对于已经熟悉Objective-C编程语言的程序员。 Swift避免了Objective-C的某些错误,所需的代码更少,维护更少,并且使移动应用程序的开发绝对简单。

Swift编程基础概述

Swift是一种用于IOS,macOS,watchO和tvO的新编程语言。 它也可以用于后端和前端开发,也可以用作脚本语言。 与其他任何编程语言一样,swift也使用变量通过标识名称来存储和引用值。 除普通类型外,Swift还引入了新类型,例如元组,枚举,结构,可选(无值)等。 Swift是一种类型安全的语言 ,它有助于弄清我们编写和工作的类型。 类型安全性有助于我们在开发过程中尽早发现并修复错误。 常量和变量 : 常量和变量将名称与特定类型值相关联。 如果未在声明中分配值,则需要为其指定类型,以便将来使用该属性。 常量的值一经设置就无法更改,因为将来可以将变量设置为新值(不同)。 “ let”用于定义常量属性,“ var”用于变量属性。 我们可以在一行中声明多个常量或变量,以逗号分隔。 2.类型注释: 在swift中,存在类型推断,因此当我们声明具有值的属性时,swift会将该值的类型分配给该属性。 因此,指定类型是可选的,但有时需要告诉编译器我们将用于该属性的特定类型。 要提供类型注释,我们需要在冒号“:”之后指定类型,后跟空格,然后是属性名称。 3.命名常量和变量: 常量和变量名称几乎可以包含任何字符,包括Unicode字符。 一旦声明了某种类型的常量或变量,就不能再用相同的名称声明它,或将其类型更改为另一种类型。 我们也不能将常量更改为变量或将变量更改为常量。 4.打印,评论,分号, 我们可以迅速使用全局函数“ print(_:seperator:terminator :)”将一个或多个值打印到适当的输出。 我们可以在SDK的调试控制台上看到打印输出。 分隔符和终止符参数具有默认值,因此我们可以在调用函数时将其省略。 我们使用注释在代码文件中包含不可执行的代码,作为对自己或团队成员的注释或提醒。 编译器将忽略所有注释。 单行注释以两个正斜杠(//)开头。 多行注释以正斜杠后跟星号(/ *)开头,以星号后接正斜杠(* /)开头 我们还可以为大型代码块编写嵌套的多行注释。 我们不需要在swift语句的末尾放置分号(’;’)。 如果需要,可以在语句末尾使用分号。 但是,如果我们想在一行上编写多个单独的语句,则需要分号。 5. Swift中的一些类型 整数 Int,UInt,UInt8,UInt16,UInt32 浮点数 双人,浮动 弦乐 6.类型安全性和类型推断: Swift是一种类型安全的语言。 类型安全的语言鼓励您清楚代码可以使用的值的类型。 编译器类型在编译代码时进行检查,并将所有不匹配的类型标记为错误。 如果我们没有指定所需的值类型,则Swift会使用类型推断来得出适当的类型。 通过类型推断,编译器只需检查您提供的值,即可在编译我们的代码时自动推断出特定表达式的类型。 当我们不指定任何类型时,Swift类型推断将提供顶级类型。 例如,即使您提供浮点类型,它也倾向于使用Double。 […]

使用Swift爆炸IPv4范围。 💥

最近,在使用SwiftNIO进行宠物项目时,我发现需要将定义为范围的IPv4集扩展到IP地址数组中。 我上过Google,但是可惜,我在Swift中找不到任何预先存在的模块或代码示例。 我还简要阅读了Apple的新Network.framework,其中引入了新的IPAddress Type和其他一些简洁的东西……但是它不包括对我所寻找的功能的支持。 😔 在过去的类似项目中,我已经多次使用ipaddress等python库。 就像一个好的图书馆一样,它们总是抽象化事物的工作原理,并为您提供一种或两种简单的方法来完成大多数任务。 我自己做一个简化版本有多难? 事实证明,一次尝试以错误的方式做几次就不会太难。 IP范围 经过几次失败的尝试,尝试使用花式迭代和不同八位位组级别的嵌套后,它突然浮现了…… “ IP地址实际上只是用易于沟通的包装表达出来的大数字”🧐 这是真的。 IPv4地址只是1到4,294,967,296(IPv4地址空间)之间的整数,表示为由句点分隔的4个8位数字(八位字节)。 知道这一点,问题就变得简单得多。 要将IP范围扩展到其组成地址列表中,您只需执行几个简单的步骤。 将上限和下限转换为整数。 构建一个数组,其中包含上限和下限之间的所有整数。 遍历数组,将整数转换回IPv4格式。 我编写了几个函数,使用几种不同的方法来完成这些步骤。 IP到整数 从IPv4转换为整数并不复杂。 我研究了几种方法。 第一种方法较为详细,但对于某些人可能更容易理解。 它的工作原理是遍历IP地址中的八位位组,然后将每个八位位组乘以下一个256的幂。这是有效的,因为IP地址的基数为256。 使用base256的IP到Int 另外,您也可以在Swift中使用位移运算符来完成此操作。 如您所见,我们的通用函数看起来非常相似,但是,我们只是在移位位,而不是进行算术运算。 使用移位将IP转换为Int 整数到IP 我认为这是棘手的部分。 同样,我们可以通过从较早的时候反转256操作的幂或使用位移来做到这一点。 但是,与从IP到Int不同,在这种情况下,按位运算显然不那么复杂。 这里使用256的幂的基本思想是在每次迭代期间(从最高有效到最低有效)使用循环提取原始IP的一个八位位组。 这有点混乱,因为第一个八位位组和最后一个八位位组与中间两个八位位组的处理方式必须有所不同。 幸运的是,按位执行此功能非常容易。 在这里,我们只是进行移位操作和按位与,以确定每个八位位组值。 放在一起 这确实是很容易的部分,并且不管上面使用的方法如何组合都应该起作用。 使用Swift即可进行简单的IPv4范围扩展。 如果您知道执行此操作的任何更优雅或有效的方法,请在评论中分享。

Rx中的反应式编程

首先,我当然建议您阅读官方文档。 在那里,您可以找到RxSwift运算符的基础知识。 本质上,在RxSwift中,所有事物都是围绕可观察对象构造的。 根据其名称,您可能会猜测我们将在整个程序中观察到此类对象的变化。 特别是,这些对象将通知您有关其状态的更改。 此外,我们拥有执行任何必要动作的能力,这些动作将改变返回的对象(过滤器,地图,flatMap等)。 因此,完整的工作流程如下所示:使用某些功能创建一个可观察对象。 例如,一个内部包含单个参数并返回可观察对象的对象。 此外,还有大量其他变体。 您可以在文档中检查它们。 使用不同的运算符(如果状态已更改)描述其行为。 例如,为了在特定条件下获取结果而进行过滤,或者设置一个线程来运行结果代码。 为每个状态(下一步,完成,错误)设置处理程序(如果需要)。 订阅-从现在开始通知观察者我们希望获得其通知。 此代码说明了订阅某些可观察对象的示例。 魔鬼并不像他画的那么黑,所以不要害怕。 该示例非常简单,因此我们将尝试逐步解释它。 您可以在文档中轻松找到所有未知方法。 首先,我们将创建一个OperationQueue。 这个阶段对您来说并不难。 现在,让我们深入探讨其他复杂的问题。 BackgroundWorkScheduler描述了用于从队列的后台执行操作的线程。 下一部分很有趣。 有些对象可以上传视频,我们将订阅其更改。 应该在后台线程上进行工作的设置,我们将在该线程上处理初始结果。 使用“ map”方法转换对象以使其成为字符串。 在主线程中开始工作,以进行UI工作 “设置”,处理下一个状态的功能。 实际上,我们在下面的几行中执行了所有这些操作。 让operationQueue = NSOperationQueue() operationQueue.maxConcurrentOperationCount = 3 operationQueue.qualityOfService = NSQualityOfService.UserInitiated 让backgroundWorkScheduler = OperationQueueScheduler(operationQueue:operationQueue) videoUpload .observeOn(backgroundWorkScheduler) .map({json in 返回json [“ videoUrl”]。stringValue }) .observeOn(MainScheduler.sharedInstance) .subscribeNext {网址 self.urlLabel.text =网址 […]

了解Swift闭包语法

尽管我鼓励开发人员为技术面试做准备,主要侧重于解决问题的方法 ,但关闭过程非常复杂,需要仔细研究。 在这个挑战中,我们的目标是创建一个名为operation()的辅助函数,该函数将把times()函数用作参数 。 如下所示,times是一个简单的函数,它返回两个输入参数的乘积: //挑战:编写一个名为operation()的新函数,该函数将times()函数用作参数。 功能 次(lhs: 整数 ,rhs: 整数 )-> 整数 { 返回lhs * rhs } 一流 成功解决此挑战需要了解Swift语法。 首先,我们应该认识到特定对象(例如枚举 , 协议和功能 )通常是与其他语言一起使用时受到限制的,它们是一等公民 在Swift中。 因此,Swift允许我们像使用标准Int或String类型一样使用它们。 由于函数可以包含参数和返回类型,因此这使得将它们表示为Closures较为详细。 考虑以下: 功能 次(lhs: 整数 ,rhs: 整数 )-> 整数 { 返回lhs * rhs } 功能 操作 (公式:( 整数 , 整数 )-> 整数 ){ 让 结果=公式(2,3) print(result)//打印6 } //时间用作参数。 操作(公式: […]

Flutter与Codemagic的持续集成

如果您甚至对移动应用程序开发不感兴趣,那么您就会知道一个陌生的孩子– Flutter。 Google的新移动应用SDK,允许开发人员使用相同的源代码和语言编写iOS和Android应用。 随着一些最大的公司开始为其应用程序选择Flutter,Flutter的受欢迎程度正在迅速提高。 例如,世界电子商务巨头阿里巴巴。 随着越来越多的应用程序,对于Flutter应用程序的持续集成和持续交付(CI / CD)需求也越来越大,以便可以对其进行定期测试和发布。 幸运的是,Google与Nevercode合作,开发了专门针对Flutter应用程序的Codemagic CI / CD解决方案。 在本文中,我们将说明如何为您正在开发或已经开发的Flutter应用设置Codemagic。 Codemagic — Flutter的第一个CI Codemagic使您可以测试和发布Flutter应用程序,而不会出现问题且没有配置。 开发人员可以运行自定义脚本并为其应用创建自定义工作流。 开始吧! 要求 要开始使用Codemagic,您需要做一些事情: 您的Flutter应用经过了一些测试。 该应用程序应托管在GitHub,GitLab或Bitbucket上。 如果您想发布到App Store或Play商店,请进行代码签名的详细信息,例如证书和配置文件。 可选的Slack工作空间,用于发送构建报告和工件。 就这样! 如果您有上述物品,现在可以将CI / CD添加到Flutter应用程序中。 现在,让我们看一下来自实际应用程序的一些基本示例。 注册Codemagic 前往codemagic.io并使用您的GitHub,Bitbucket或GitLab帐户进行注册。 您可以使用一个Codemagic帐户连接所有这些存储库,因此可以将所有应用程序放在一个位置。 创建您的第一个版本 登录后会看到的第一件事是带有应用程序存储库的仪表板,您可以在其中过滤或搜索应用程序以找到Flutter应用程序。 现在,您可以通过单击“开始您的第一个构建”按钮开始。 默认构建工作流程 一旦开始构建,Codemagic将为Flutter项目创建工作流程。 如果需要,可以对其进行自定义以满足您的需求。 默认工作流程将通过以下步骤开始构建。 这些步骤包括准备构建机器,签出源代码,安装Flutter依赖项,运行测试,构建应用程序以及发布工件。 建立报告 构建完成后,您将能够看到所有详细信息的概述。 看起来像这样: 您还将收到包含所有这些详细信息的电子邮件。 如果您希望在Slack频道中拥有构建报告,也可以这样做。 那很容易,不是吗? 构建失败 不幸的是,并非所有构建都成功。 在这种情况下会发生什么? Codemagic提供每个步骤的非常详细的日志,无论该步骤是否通过。 在这里,我们可以看到失败的单元测试,并且所有详细信息都记录在构建失败中。 如我们所见,集成测试和小部件测试通过了,但是单元测试失败了。 您可以解决问题以修复构建。 […]

Flutter vs React Native:开发人员的观点

Facebook的React Native和Google的Flutter –两项热门的跨平台应用程序开发技术引起了轰动。 在这篇文章中,我们将从开发人员的角度对两者进行详细比较。 什么是Flutter和React Native React Native是一个由Facebook内部发起的项目,于2015年开源。另一方面,Flutter是Google发起的一个项目,自2017年I / O以来一直在大力推广。 我们将使用十个标准对它们进行比较: 程式语言 技术架构 安装 设置和项目配置 UI组件和开发API 开发人员生产力 社区支持 测试支持 构建和发布自动化支持 DevOps和CI / CD支持 现在,我们已经定义了所有标准,让我们开始详细研究每个标准。 程式语言 使用跨平台移动应用程序开发技术的主要好处是能够使用一种编程语言为iOS和Android开发应用程序。 React Native — JavaScript React Native使用JavaScript来构建跨平台应用程序。 JavaScript是目前在网络社区中非常流行的语言。 它通常与React和其他流行的JavaScript框架一起使用。 多亏了React Native,Web开发人员可以通过一些培训来构建移动应用程序。 考虑到这一点,公司将React Native视为明智之举。 扑-飞镖 Flutter使用Google于2011年引入的Dart编程语言,开发人员很少使用。 Dart语法支持JavaScript或Java开发人员的大多数面向对象的概念,因此很容易理解。 Dart入门很容易,因为这里的Dart官方网站上有大量出色且易于遵循的文档。 分析与结果 由于JavaScript被大多数Web开发人员广泛使用,因此采用React Native框架很容易。 Dart也具有出色的功能集,但在开发人员社区中很少使用且鲜为人知。 考虑到这一点,很明显,React Native在编程语言类别中胜出。 技术架构 选择跨平台的移动应用程序开发框架时,必须考虑其技术架构。 通过了解框架的内部,我们可以做出明智的决定,并选择最适合我们项目的决定。 反应本机—通量 React Native架构严重依赖JS运行时环境架构,也称为JavaScript桥。 JavaScript代码在运行时被编译为本机代码。 […]