Tag: 编程

代码挑战:在Swift中遍历数据结构

最近,我有机会帮助iOS面试计划的学生为大多数人认可的公司准备了一次重要的技术面试。 总体而言, 我的课程融合了代码挑战和实时白板会话的组合,测试了人们在Swift中实现语法,设计模式和算法的能力。 挑战 有时,我会听到人们回覆他们的采访经历。 有时,某些类型的问题会使开发人员感到惊讶。 如果您意识到了挑战,那就太好了! 对于我们其他人,这里是摘要: //给出以下树: // 1 // 2 3 // 4 5 7 // 8 9 //由此类实现: 类 基站 { var键:T? 左变数: 基站 ? 右: 基站 ? var高度: 整数 在里面() { 自。 高度 = -1 } } //使用以下函数获取以下输出: //预期输出: // 1 // 2 3 // 4 5 7 // 8 […]

轻松构建URLRequest

在本文中,我将向您展示一种简单的方法,以简化开发人员在应用程序的开发过程中必须执行的最长且最无聊的任务之一。 如今,大多数应用程序都需要某种类型的网络。 在iOS中,这意味着我们必须在某个时候与URLRequest类作斗争。 如果我们不小心的话,这并不总是那么容易,并且可能导致各种各样的错误和问题。 首先,为了更好地理解示例,我们需要了解以下定义: https://gist.github.com/Juanpe/8c902c8c0c5f342767a67ee62308d5e2 想象一下,我们有一个执行网络请求的APIClient 。 此类具有构建URLRequests的方法。 我们的代码可能是这样的: https://gist.github.com/Juanpe/58439c60e7d63d605ad06427a6fa0caf 如您所见,此方法很长,并且有多个责任。 因此,我们增加了测试的复杂性,并且不符合SRP原则。 是时候到建造者了 使用Builder模式是一个完美的方案: Builder是一种创新的设计模式,可让您逐步构造复杂的对象。 该模式使您可以使用相同的构造代码生成对象的不同类型和表示形式。 尽管我认为很清楚,但是基本上这种模式可以帮助我们以更简单的方式构建复杂的对象。 该模式将对象构造组织为一组步骤。 要创建对象,请在构建器对象上执行一系列这些步骤。 重要的部分是您不需要调用所有步骤。 您只能调用产生对象的特定配置所必需的那些步骤。 现在,我们知道了模式的定义,因此我们将创建URLRequestBuilder : https://gist.github.com/Juanpe/e8b3cd2c5a17a14d68ccc01d79aa553b 每个方法的顶部都有一个关键字disableableResult,以避免警告未使用的结果。 此类具有创建URLRequest所需的所有属性,其中一些是可选的,而其他则是必需的。 然后定义步骤,每个set方法就像创建对象所需的步骤。 最后,我们有一个编译方法,该方法收集所有信息并生成最终对象。 多亏了Swift,我们可以使用方法链接,所以方法看起来像这样: https://gist.github.com/Juanpe/6707fc371d0a496910d1a9bd008c29e4 结果是一种更具可读性的方法,仅需5行代码,并且只需承担一项责任。 因此,我们已将请求创建与APIClient隔离开了。 奖金 很多时候,在发送请求之前,我们必须进行一项或多项更改才能满足API的要求。 例如,如果我们使用OAuth2对请求进行身份验证。 使用Alamofire的 方法,我们可以创建一个RequestAdapter 。 其目标是接收请求,进行必要的更改,然后再次返回。 RequestAdapter将是: https://gist.github.com/Juanpe/d953000cc55522c0f5f2312cd2a1d662 使用OAuth2示例,他的适配器如下所示: https://gist.github.com/Juanpe/e877f96aaaac1c7e1c122dd6e96ca80c 要将这个新元素包括在我们的构建器中,我们只需要添加带有所有必要适配器的新属性,并在编译方法中添加逻辑即可: https://gist.github.com/Juanpe/721a2198bed905becd0cc859628895e4 结论 也许看到了我们添加到项目中的所有代码,我们认为我们增加了复杂性,但这不是事实。 在最初的示例中,我们的APIClient负责创建请求,这是不正确的,因为唯一要做的就是发送请求。 因此,我们将打破SRP原则。 另外,现在我们的代码更具可扩展性,可读性和可测试性。 在实际的项目中,API的规范会不断变化,因此我们必须修改请求的创建。 使用我们的代码,我们只需要修改构建器,而不必修改结构的任何其他元素。 最后,我们了解了Builder模式的工作方式。 我可以告诉您,您很有可能最终会在应用程序的其他部分中使用它。 […]

使用Swift了解哈希表,字典和集合

在帮助iOS开发人员准备技术面试时,我经常讨论哈希表。 由于效率高,哈希表是候选人在应对编码挑战以及实际应用程序时应考虑的出色工具。 在本文中,我们将探讨哈希表的概念,并将其与其他集合类型(例如字典和集合)进行比较。 词典 要了解为什么哈希表很有用,应该熟悉它们的设计。 当被问到时,许多学生都认为“哈希表就是字典”。为验证这一点,让我们回顾一下标准的Swift字典类型: 变种 清单= 字典 ()//添加字典值-恒定时间O(1) list [“ WB”] =“ Wayne Bishop” list [“ FB”] =“弗兰克·霍布斯” list [“ LP”] =“拉里·佩奇(Larry Page) list [“ AE”] =“阿尔伯特·爱因斯坦” //检索密钥 对于 s在list.keys { 打印 (秒) } //获取值 对于 v在list.values { 打印 (v) } //通过键获取值-恒定时间O(1) 让 item = list [“ WB”] //收回“ Wayne Bishop” 词典是处理许多情况的有用类型。 由于键和值都是在运行时提供的,因此可以编写例程来检索单个键,值或它们的混合。 […]

在Swift中减少– Khoa Nguyen –中

减少Swift 版本:Swift 3 您可以使用reduce组合集合中的所有项目(Array或Dictionary)以创建一个新值。 让我们看一下带有两个参数的reduce方法:initialResult和Combine闭包。 这是我们使用这种方法的方式: 如果您觉得很难记住,请使用以下解决方案: 它也适用于简短版本: 当我们使用循环而不是reduce: 您将看到使用函数式编程(在这种情况下,使用reduce )带来的更复杂的问题。 问题 :我有一个Product数组,每个元素都有3个属性:名称,价格,availableAmount。 我如何计算总价格和总可用量与reduce这个数组的所有元素? 在这种情况下,我使用Tuple作为初始值和返回类型 结果: 提示:如果您发现难以理解使用Tuple,进行reduce Tuple,回顾这张图片。 您可以使用循环重写此逻辑,并查看有多少行代码。 我并不是说您用更少的代码会看起来更加专业。 但事实是,您将提高工作效率并节省大量时间。 你喜欢这篇文章? 请分享! 懒输入代码-> Github上的Swift教程

在Swift中编写轻量标记解析器

这篇文章的完整代码可以在这里找到 。 最近,我不得不编写一个轻量级的标记解析器,以在我们的iOS应用程序中提供文本格式。 要求与您在其他富通讯应用程序中可以找到的要求类似: 为了强调单词或句子,用户可以用*号包围文本以创建粗体文本,或用_underscores_表示斜体文本。 要在消息中显示更正,用户可以用〜波浪号〜包围文本以删除文本。 用户可以组合格式选项。 因此,以下文本: 那个*快速*,〜红褐色的狐狸跳过了_ *懒狗* _。 应采用以下格式: 敏捷的棕狐狸跳过了一条懒狗 。 另一个附加要求是字内格式化不应该被允许。 例如,以下文本: 计算_6 * 4 * 8_。 _Quick_zephyrs_blow_。 应采用以下格式: 计算6 * 4 * 8 。 Quick_zephyrs_blow 。 我考虑了实现解析器的几种方法,包括Parser Combinators ,但是最后,我决定从头开始编写它。 这样做可以让我完全控制性能。 我们可以将标记文本格式分解为以下步骤: 令牌化,这是将输入字符串分解为令牌(格式定界符和文本)的过程。 解析 ,这是解释标记以生成格式化文本的抽象表示的过程。 渲染 ,包括将抽象表示形式转换为NSAttributedString 。 让我们详细了解实现每个步骤的细节。 实施分词器 我们的标记格式具有三种不同的标记: text , left delimiter和right delimiter 。 每个令牌应携带上下文信息,例如定界符或实际文本。 让我们创建一个enum来建模: 枚举MarkupToken { […]

iOS:使用Firebase发送推送通知

我目前正在学习【Swift 4】以扩展我的编程知识。 几年前,我看过Swift,但现在准备好深入研究它。 我已经使用Java编程多年,并且对Python有所了解。 因此,我学习一种新语言的方法受到该先前知识的影响。 ☞步骤1:在XCode上创建一个空项目 一种。 选择“ 单一视图应用” b。 确保您提供唯一的软件包名称。 C。 启用功能远程通知和推送通知 单击.xcodeproj->功能->启用推送通知 ☞步骤2:使用Pod安装要求 Firebase和FirebaseMessaging等要求。 在安装之前,请确保您的机器已安装Cocoapods。 如果未安装,请不要担心,可以从这里轻松安装。 // open terminal and run below command $ cd /your-project-directory/ //使用此命令初始化pods $ pod init 发布此命令Podfile将在项目根目录中创建//使用vi或vim编辑器(无论您的计算机上安装了什么) $ vim Podfile //继续安装添加的Pod $ pod安装 ☞步骤3:设置Firebase帐户 一种。 从这里创建项目 b。 从Firebase控制台输入创建的项目。 选择应用程序环境,Android / iOS / Web。 确保您的软件包名称(或bundleId)与设置XCode应用程序时输入的名称相同。 C。 将配置文件(通过上述过程生成)添加到项目根目录: GoogleService-Info.plist ☞步骤4:在Apple帐户中设置证书 一种。 […]

婚姻:可选? 可选的!

最近,我在Swift中学习了可选内容。 的种类。 我仍然不确定我是否正确,所以我将用简单的语言向您介绍可选内容。 这是一个关于名叫裁缝的女孩的故事,她真的想找到一个梦her以求的男人。 一天,她打开了火种,发现了4场新比赛:本,帕特里克,约翰和山姆。 让本:字符串 让帕特里克:弦! 让约翰:字符串? 让萨姆:字符串? 她还很年轻,喜欢神秘的事物,所以Ben对她来说太无聊了:她知道它们会约会一年,然后他会向她求婚。 帕特里克在个人资料中写道,他正在寻找妻子。 她认为他对她太直率了。 矛盾的女性心脏! 但是约翰和山姆的一切都不一样。 一个是花花公子,另一个是一个人。 她可能会得到一个建议,或者……什么都没有。 有点吓人但是有趣…… 约翰=“嫁给我,裁缝!” 要么 约翰=零 当然,她可以用力解开并假装一切正常。 结婚(约翰!) 但是在这种情况下,一个美丽的早晨,她可以发现约翰失踪了,她的心和生命将被打破。 裁缝想在某年(也许不是现在)几年内结婚。 她绝对不想成为一个大佬! 所以她决定和约翰约会。 漂亮的脸蛋,好地方。 但是如何更好地了解他,又不花她的青春去伤心? 裁缝决定用谷歌搜索它。 第一个建议是“问他是否要嫁给你” 。 因此,如果一个男人希望结婚,则可以毫无顾忌地开始与他约会。 如果john!= nil { 让happyLife =约翰! } 约翰大吃一惊,整个晚上都保持沉默。 他喃喃自语,他需要考虑这一点。 当然,他第二天不给她打电话。 再也不会。 有时候,直率并不是最好的朋友。 在此之后,Tailor感到失望和困惑。 但是那里留下了山姆。 幸运的是,她认识了山姆的最好的朋友汤姆。 所以她决定问他山姆是否有一天要嫁给她。 如果让汤姆=山姆! {让weddingProposal =汤姆} 当然,在这种情况下,汤姆也参与了他们的关系,这是不好的。 裁缝无意中伤害了汤姆,因为他喜欢汤姆,而他的自尊心受到了破坏。 该怎么办? 她很困惑,因此问汤姆一个模糊的问题,山姆是否考虑过婚姻。 如果sam?.length> […]

在Swift中断言以及为什么要使用它们

断言:自信而有力地陈述事实或信念 您是否曾经编写代码并将其充满print(“Something happened here.”)胡说八道? 您知道,从理论上讲,它不应该被调用,但是在确实发生这种偶然性的情况下,您想知道吗? 现在,您在代码中散布了随机行,这些行并没有给您的应用程序带来任何实际好处。 什么时候发生—令人震惊—它确实发生了,但是调试器充满了垃圾邮件,您错过了它。 我第一次尝试在代码中使用asserts是在今年年初,当时我正在研究一些测试用例。 在我刚开始进行测试时,我开始发现到处都是这些assert(value != nil, “Error: …”)窍门。 我很快发现断言对于您的项目是非常有用的测试和调试工具。 但是他们怎么办? 断言要求给定条件为真,否则它将立即使应用程序崩溃。 但这不是很糟糕吗? 在生产中,是的! 通常,为了用户的利益,您通常希望避免崩溃,但是有时应用程序处于严重的状况,以至于无法继续进行危险。 如果您正在调试应用程序,那么崩溃可能非常有用,因为它可能直接导致您遇到问题。 当我从Web上的JSON文件中获取数据时,我可能不会总是收到期望的结果。 这可能是因为像打字错误一样简单,例如尝试访问data[“result s “]而不是data[“result”] 。 例如,如果我要查询小狗社交媒体API,则可能期望与特定的小狗匹配。 但是,如果那只幼犬的帐户由于过于可爱而被撤消怎么办? 这是一种现实情况,人们似乎并没有认真对待。 无论如何,如果我的代码依靠某个名为“ Belle”的小狗存在于数据库中,而她却没有,那么我的应用程序可能会以奇怪的方式响应。 让myPuppyInfo:[String:Any] = … 守卫让puppyData = myPuppyInfo [“ puppies”]为? [String:任何], 让Alice = puppyData [“ Alice”]表示为? [String:任何], 让Belle = puppyData [“ Belle”]为? [String:任何]其他{ assertionFailure(“解析JSON时出现问题”) 返回Result.failure(.unableToParse) } 在上面的示例中,我希望获得两只狗的数据:爱丽丝和百丽。 […]

测试unitario Swift

西班牙语测试,测试,测试,测试,测试和测试。 重新测试无法实现的错误和不正确的解决方法。 1.目标测试 XCode的中型企业和中型企业的标志性形式。 (图像中的蓝色天空) En el mismo navegador,en la barra de abajo pulsamos sobre elbotón+ y seleccionamos 新单元测试目标 2.分类测试 埃尔·纽埃目标瓦斯·哈瓦拉·克雷多·厄瓜多尔·厄瓜多尔·普罗维克托·科普诺· 阿卡巴多 是的,您可以通过测试,测试和修复项目, 构建设置或公交车来启用可测试性和功能。 测试的目的是通过测试进行测试。 Volvemos al archivo Tests.swift。 Viene predefinido con unas funciones de las cuales solo vamos a dejar por el momento dos。 Dentro de la clase de test al lado de la […]

无线跑步

苹果公司为客户提供的有线,有线和有线方式提供XCode 9许可证。 X Code 9违规行为: 要求: XCode 9或高级 Dispositivo conectado a la misma red que el mac Xcode Separual的Primero Hay que Tener El Dispositivo Conectado电缆。 埃斯托独奏曲。 Luego dentro de XCode pulsamos⇧⌘2是从 simulador y dispositivos发行的。 脉冲状的辣椒酱,通过红色涂成新的麦昆奎拉莫斯奶酪。 检查通过网络连接 。 最好的检查和确认您的电子邮件。 Una vez pulsado el check nosquedaráasí: 是的,您需要分配给您的报名是: ÿ 电缆和无线脉冲通过红色运行无线分布图。