Tag: 软件开发

在Swift中实现编程语言—第4部分:解析器

这是“用Swift编写编程语言”教程系列的第四部分。请务必查看 第3部分 。 语言解析被广泛认为是只有经验丰富的程序员才能做的事情。 这是几乎在任何领域都常见的误解。 当然,作为Swift等广泛使用的语言的核心贡献者,意味着您必须在该主题上拥有丰富的经验。 但这适用于每种类型的编程,并且不应使我们害怕创建自己的解析器。 什么是解析器? 解析器的主要目标是将Lexer生成的令牌列表转换成我们语言语法的数据结构,通常,这种“数据结构”是类似树的结构,例如“抽象语法树”。 像计算机科学中的所有内容一样,最好使用Wikipedia(:)来定义这种树。 抽象语法树是用编程语言编写的源代码抽象句法结构的树表示。 哇,这是很多定义不正确的概念。 让我们分解一下: 摘要—事实证明,我们并不关心解析器收到的所有令牌。 考虑表达式2 * (2 + 3) ,这里的树实际上不需要关于左括号和右括号的信息。 只是在其中表达的优先级。 括号已被抽象出来。 语法结构—用Swift的术语来说,这通常意味着任何表示struct , enum或class struct ,它们表示源代码如何以我们的语言语法形成。 自顶向下解析 实现解析器的方法有很多,但是我们今天要看的是自上而下的解析。 在自上而下的解析中,在继续进行更详细的部分之前,将生成语法语法树的最高级别的结构。 通常认为它比同等技术(自下而上)要慢一些,但更容易掌握,因此非常适合本教程。 递归体面解析 自上而下解析的一种非常流行的方法称为递归体面解析。 这种流行并不是巧合,因为它们最容易实现。 正如您可能假设的那样,这种简单性需要付出一定的代价,而您将是对的,因为它们也是性能最低的。 但是我们还是会选择递归体面的方法,以使本教程尽可能简单。 实作 对于我们的解析器,让我们从简单的类定义开始: 类解析器{ 让令牌:[令牌] var index = 0 init(令牌:[令牌]){ self.tokens =代币 } } 在全面实施之前,有必要回顾一下我们的语法: E⇒ | | () 运算符⇒ […]

Revertir cambios locale en GIT

在我的博客上,您可以解决问题,也可以解决所有问题,请联系我们。 克拉罗(Claro),影响GIT。 我的工作人员是我的“工作人员”,现在负责解决问题。 普埃斯图克·卡达·普瓦克托·普瓦克托·普瓦克托·普瓦克托·普瓦克托·普瓦克托·普瓦克托·普埃斯图克 Finalmente,Entrando en Materia,Éstetema megustaríadividirlo和2个部分: Cuando buscamos还原cambios语言环境 Cuando buscamos revertir cambios en un repositorio remoto(el cual analizaremos en el siguiente post) 问题 支持“媒体可视化器”的应用程序,可以在iOS上添加列表或添加到列表中。 Al seleccionar una,los datos en pantalla se实际的con dicha图像。 客户服务与客户关系的决定。 Se han tenido 2的大注定为“Versión1”(terminado en el提交5bc6d73 )和“Versión2”(ubicado en el commit c0c5533 )。 客户,客户和客户在任何情况下都应按先例进行分类,然后再从版本1到版本2进行实际操作。 一个复杂的信息系统,一个名为GIT的合作伙伴,一个名为deDeveloproll的合作伙伴,“开发”。 Entonces¿quépodemos hacer? Solución 现实世界中的一切都发生了,水族犯下了一个错误的故事-坎比阿斯·肖恩(cabios que sean […]

对Lona的贡献+如何在macOS上设置Ruby环境

本周初,我正在查看Airbnb的开源项目,并且发现了一个名为Lona的项目。 Lona是用于构建设计系统并使用它们生成跨平台UI代码,Sketch文件和其他工件的工具的集合。 (来自Lona的GitHub存储库) 我真的很喜欢这个项目的想法,所以我选择它作为我的开源课程的下一个项目。 没有打开很多问题,而且我不确定一开始是什么好任务。 我使用了项目自述文件中的提示,其中指出: 如果您有兴趣在公司中贡献或使用它,请随时打开GitHub问题或在Twitter @dvnabbott上与我联系。 (Lona README) 因此,我发了推文给正在维护该项目的Devin: 在开放源代码开发方面有一些经验,我知道维护者和贡献者之间的交流非常重要。 我相信,这是围绕该项目建立社区并让人们希望将来做出更多贡献的关键。 我感谢他的时间,并提供了很多帮助。 让我们回到项目本身。 Lona包含3个部分: Lona Components —跨平台组件的数据格式.component Lona Studio —用于设计.component文件的GUI工具,Swift Mac应用程序。 Lona Compiler —一种CLI工具和API,用于从.component文件,ReasonML生成UI代码 从上面的推文中可以看到,我选择了Lona Studio作为我的贡献。 我决定在接下来的几个月中专注于Swift开发,因此我想尽可能多地使用这种语言。 另外,我发现它很有趣,因为我以前从未使用过Mac应用程序,据我所知,macOS开发与iOS开发有很大不同。 设置项目 首先,我必须在机器上设置项目。 对我来说这不是小事,因为我没有一个先决条件。 为了从源代码构建Lona Studio,您需要安装以下工具: 捆扎机 可可豆 迦太基 我的Mac上已经安装了CocoaPods和Carthage,但是我没有Bundler,甚至没有听说过。 Bundler通过跟踪和安装所需的确切gem和版本,为Ruby项目提供了一致的环境。 (来自bundler.io) 我以前从未接触过Ruby,因此我必须设置Ruby环境才能安装Bundler。 首先,您需要安装RVM(Ruby版本管理器)。 这是我用于安装它的步骤: 安装GnuPG 酿造安装gnupg gnupg2 2.安装RVM的密钥 gpg –keyserver hkp://pool.sks-keyservers.net –recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB 3.运行经过验证的安装 […]

iOS:使用服务器中的图像

如果您是移动应用程序开发人员,则有时需要与后端进行交互。 您可能需要执行的任务之一是从服务器检索并显示图像,或将图像提交到该服务器。 提交图像时应使用哪种格式? 您如何将从服务调用中收到的字节转换为图像? 让我们构建从服务器到iOS App的整个堆栈,以了解操作方法。 设置一个后端 我们将首先构建一个Kitura服务器,该服务器提供RESTful API来完成两件事: 从客户端接收图像 提供接收到客户端的最新图像 我已经把完成的服务器放在我的Github上了 。 创建服务器项目 创建一个目录,并初始化一个新的可执行Swift包。 mkdir mkdir SwiftImageServer && cd SwiftImageServer swift package init –type可执行文件 编辑您的Package.swift文件,以指定您需要Kitura软件包。 导入PackageDescription 让package = Package( 名称:“ SwiftImageServer”, 依赖项:[ .Package(URL:“ https://github.com/IBM-Swift/Kitura.git”,majorVersion:1 ) ]) 您可以运行swift package fetch并且应该看到SwiftPM克隆Kitura及其所需的一切。 使用swift package generate-xcodeproj ,让我们开始编码! 创建一个Kitura服务器 后端将非常简单,因此我们将在main.swift 。 让我们从添加所需的所有样板开始: 进口Kitura import Foundation //创建一个可用于创建REST端点的路由器 let router = […]

Swift的SOLID面向对象设计原则

iOS首席工程师Buymie的Mnats Karakhanyan 好的软件系统应该具有好的架构和构建块。 如果没有很好地构建模块,那么体系结构就没什么大不了的,那么您最终可能会使用构建良好的模块构建一个糟糕的系统。 这就是SOLID原则的用武之地。 SOLID原理告诉我们如何将我们的功能和数据结构安排到类中,以及如何将这些类互连。 注意: “类”一词并不意味着这些原则仅适用于面向对象的软件。 类只是功能和数据的耦合分组。 每个软件系统都有这样的分组。 SOLID是5条原则的首字母缩写,代表: S:单一责任原则(SRP) O:开闭原理(OCP) L:李斯科夫替代原理(LSP) 一:接口隔离原理(ISP) D:依赖反转原理(DIP) 这些原则的目标是创建以下软件结构: 容忍变化 容易理解,并且 是可在许多软件系统中使用的组件的基础。 SRP:单一责任原则 类或模块应该有一个更改理由,并且只有一个更改理由 该原则为我们提供了责任的定义和班级规模的准则。 班级应该承担一项责任-改变的原因之一。 违反SRP的示例。 让我们看看这堂课有什么样的责任? 从API检索数据 解析API响应 将数据保存在数据库中 我们可以解决此问题,将职责移至类: 注意:听到这个名称太容易了,然后假设它意味着每个模块都只能做一件事 。 有这样的原则。 一个函数应该做一件事情,并且只能做一件事情。 违反原则的症状是意外复制和合并。 OCP:开放封闭原则 软件实体(类,模块,功能等)应打开以进行扩展,但应关闭以进行修改 让我们看一个违反OCP的例子。 考虑类AnaliticServise,该类正在跟踪Facebook中的事件。 现在,我们还想增加在Google Analytics(分析)中跟踪相同事件的可能性。 不违反OCP的解决方案可能如下所示: 注意:遵循OCP通常会引入新的抽象级别,这会增加我们代码的复杂性。 您想专注于最有可能在您的设计中发生变化的领域,并在其中应用原理。 LSP:李斯科夫替代原则 令Φ(x)是关于类型T的对象x的可证明性质。那么对于类型S的对象y,其中S是T的子类型,则Φ(y)应该成立。

让我们动起来:React Native动画简介-第3部分

如果您想完全从头开始,这里是第1部分的链接,在第1部分中,我们使用LayoutAnimation动画了单个元素在屏幕上的重新放置。 在第2部分中,我们讨论了Animated API,内插值和循环动画。 我们把东西包起来怎么样? 我们将在本系列文章中介绍的最后一件事是根据用户的手势输入为屏幕上的元素设置动画。 您可能不会立即将其视为“动画”,但是该元素不仅会自动移动。 为此,我们将使用React Native所谓的PanResponder 。 我们将使用其中之一来允许我们在屏幕上拖动Jake。 首先,让我们创建一个新的Animated.Value来保存Jake的位置并使用用户的手势对其进行更新。 因为我们要沿着X和Y轴移动Jake,所以我们将在构造函数中创建一个Animated.ValueXY ,而不仅仅是Animated.Value 。 我们不需要传递任何默认值,因为我们不需要像上一篇文章中对旋转值所做的那样对起始值进行任何假设或对其进行插值。 this._gestureValue = new Animated.ValueXY(); 接下来,我们需要创建PanResponder的实例。 我们import PanResponder from ‘react-native’ ,并在新的_gestureValue下创建它。 它需要许多配置选项。 这直接来自React Native文档: this._panResponder = PanResponder.create({ //要求成为响应者: onStartShouldSetPanResponder:(evt,gestureState)=> true, onStartShouldSetPanResponderCapture:(evt,poseState)=> true, onMoveShouldSetPanResponder:(evt,gestureState)=> true, onMoveShouldSetPanResponderCapture:(evt,poseState)=> true, onPanResponderGrant:(evt,手势状态)=> { //手势已开始。 显示视觉反馈,以便用户知道 // 怎么了! //现在将gestureState.d {x,y}设置为零 }, onPanResponderMove:(evt,手势状态)=> { //最近的移动距离是gestureState.move {X,Y} //成为响应者以来的累计手势距离为 //gestureState.d{x,y} […]

Xcode服务器和机器人

自从Xcode 5推出以来,我一直对Apple的持续集成产品感到非常好奇。当时,我发现它不适合我从事的项目。 虽然我一直在关注它的进展,但自上次尝试以来已经过去了将近五年。 我有机会使用许多CI系统:Jenkins,Cruise Control,TeamCity,TravisCI和CircleCI。 其中,我更喜欢TravisCI。 特别地,我真的很喜欢将所有配置都保留在仓库本身中的模型。 我还发现他们的系统既可靠又有能力。 但是,对于封闭源项目,TravisCI相当昂贵。 因此,我配备了新的Mac mini,以为我会再次尝试Xcode Bots。 安装 安装Xcode Server非常简单。 只需下载Xcode,启动它,然后单击“开关”即可。 完成此操作后,将引导您设置用户以供服务器使用。 我喜欢为CI系统使用专用用户帐户的想法,这是一种常见的方法。 虽然我确实是在单独的机器上进行设置的,但我认为这对于单机设置也可以正常工作。 创建一个机器人 “ Bot”一词有点奇怪,但在其他系统中大致对应于“ job”或“ project”。 Xcode有一个向导,它将指导您完成该过程。 我有种感觉,尽管这个向导在第一次尝试时,即使是适度的复杂性,大多数项目也无法实现。 在让我的第一个Bot成功工作之前,我经历了许多错误的开始。 公平地讲,这是我几乎已经完成的所有CI工作的经验。 也许我运气不好… 我遇到了两个问题。 首先是我的Bot无法访问所需的git存储库。 第二个是设置和安装构建所需的依赖项。 解决这些问题并不需要太多工作。 Git仓库和SSH 毫不奇怪,Bot需要能够检出您的代码,然后才能执行其工作。 Bot配置有一些不同的选项可用于检出其存储库。 您可以在Bot创建UI中配置许多不同的基于SSH密钥的设置。 我选择使用“特定于Bot的SSH密钥”选项。 这提供了一个公共密钥,我使用该密钥来使机器人访问存储库。 至此,我的Bot已成功签出并构建了我的项目。 但是,由于缺少依赖关系,构建立即失败。 依存关系 我使用迦太基管理项目中的依赖项。 我也不会将任何依赖项源或工件检入源代码控制中。 这意味着仅检查源代码不足以构建项目。 机器人程序有一种机制,被称为“触发器”,可以运行集成前和集成后的脚本。 这些采取由Xcode Server用户帐户执行的bash脚本的形式。 这是安装依赖项并照顾其他环境设置的理想方法。 但是,就我而言,依赖管理器本身需要首先安装。 我通过登录到构建机器并通过自制程序安装Carthage来完成此操作。 这使迦太基对机器的所有用户可用。 但是,这还不够,因为Xcode Server用户仍无法访问Carthage存储库。 事实证明,集成前触发器与签出存储库所使用的每机器人SSH密钥不同。 […]

带有CALayer的动画进度加载器— Swift和Xcode

开发iOS应用程序时,通常需要从CDN中获取图像,这可能需要一些时间,具体取决于图像的大小,服务器速度和设备的网络连接。 在此获取时间内,您的UI将已经呈现,并且您想显示图像获取进度的可视指示器。 在iOS上,您具有默认的UIActivityIndicatorView 。 它可以工作,但是您可以轻松创建更具个性化的新对象。 要求 Xcode Swift的知识 Apple Swift官方文档(https://developer.apple.com/documentation/quartzcore) 斯威夫特游乐场 让我们深入研究代码 首先,我们需要创建装载机的形状。 对于此示例,我们需要一个循环加载器。 让我们创建跟踪图层,以显示加载程序的形状。 让trackLayer = CAShapeLayer() trackLayer.position = CGPoint(x:50,y:50) trackLayer.lineCap = CAShapeLayerLineCap.round trackLayer.lineWidth = 2 trackLayer.fillColor = UIColor.clear.cgColor trackLayer.strokeColor = UIColor(红色:80/255,绿色:80/255,蓝色:80/255,alpha:0.5).cgColor trackLayer.anchorPoint = CGPoint(x:0.5,y:0.5) 现在已经创建了图层,我们想要定义圆形。 trackLayer.path = UIBezierPath(arcCenter:.zero,半径:10,startAngle:0,endAngle:2 * CGFloat.pi,顺时针:true).cgPath 为了显示跟踪图层,我们必须将其添加到视图中。 view.layer.addSublayer(trackLayer) 如果您在操场上跑步,您会在左上角看到一个圆形。 做得好,我们已经准备好跟踪层。 现在,我们需要创建一个新图层,该图层将与跟踪图层重叠并根据加载进度进行填充。 让shapeLayer = CAShapeLayer() shapeLayer.position = CGPoint(x:50,y:50) shapeLayer.lineCap = […]