如何保持您的iOS本地化文件整洁-Swift脚本版本

与bash脚本类似,我们首先通过create()从根目录中递归搜索本地化的字符串文件。 Apple的FileManager通过枚举对象使文件搜索变得容易。 注意,由于我们通常将打包在本地化文件中的Pod本地化文件打包,因此我们将忽略它们。在parse(_ path: String)方法中的本地化文件并存储时,我们将在此处搜索键重复来优化脚本。 Set的键。 该方法将为所有重复的密钥以及找到的文件路径打印error 。 ( 注意:任何 print(“error:”) 或 print(“warning:”) 格式都会通知Xcode在工具栏上显示相应的消息以及其他构建失败和警告 ) 接下来,我们将验证validateMatchKeys方法中所有可本地化的字符串文件中的键是否匹配。 我们将使用symmetricDifference编织出任何与基本文件都不匹配的额外键。 如果任何可本地化的文件不包含相同的键,则此方法将引发错误并中止脚本。 这使您有机会在下一次执行cleanWrite()之前清理可本地化的文件,它会使用已排序的键并删除多余的空格和换行符来重写可本地化的文件。 下一步是搜索代码库,存储这些文件中使用的密钥,并根据我们的基本密钥进行验证。 有了一点正则表达式,我们就可以成功找到密钥并将它们和文件的路径存储在LocalizationCodeFile结构中,同时还可以通过紧凑地映射出没有密钥的任何文件来优化脚本。 一旦有了我们的结构,我们将点击validateMissingKeys() -将遍历我们的LocalizationCodeFile集合,并减去基本键的每组键。 此结果中的任何其他键都不是我们基本键的子集,因此会给我们丢失的键。 如果找到任何丢失的键,则会引发错误。 我们的最后一个策略是搜索任何死键,这些死键是在可本地化文件中定义但未在我们的代码库中使用的键。 我们可以通过从flatization从LocalizationCodeFile集合中收集的所有键减去基本键来检索死键。 此处找到的所有键均显示为警告,因为此步骤更多是建议清除技术债务,而不是影响问题的用户。 对具有600多个可执行文件和估计800多个密钥的企业代码库执行bash脚本平均要花费81秒 。 在相同的代码库上运行此swift脚本平均要花3秒 ! 🚀🙌 保持干净 ,可读的代码库应该是每个工程师的目标。 通过将此Swift脚本注入到您的后期构建中,清理和维护可本地化的文件应有助于实现该目标并感到自动化。 您可以阅读我以前的博客,以了解如何将脚本注入到Xcode构建后编译中( https://buildingvts.com/clean-ios-localizable-files-8b910413b985 )。 我还在其中包括了一个包含整个脚本的GitHub项目以及此处的示例项目:https://github.com/ginowu7/CleanSwiftLocalizableExample。 随时发表任何意见或建议,您可以在Twitter @ ginowu07上关注我! 编码愉快! 🙏

在您的Swift应用中运行时内省和修改类

介绍ObjectiveKit 还记得2016年5月的重大动态辩论吗? 如果没有,请快速阅读以下内容: 动态迅捷 布伦特·西蒙斯(Brent Simmons)(如果有不清楚的话,请参见存档):在最近和将来的文章中,我正在记录问题…… mjtsai.com 简而言之,争论是开发人员目前正在利用ObjC运行时的动态功能解决许多类型的问题。 当我们(可能)朝着Swift完全取代Objective C的未来迈进时,Swift将需要提供自己的本机动态解决方案。 在iOS和macOS上,至少在可预见的将来,Swift将在Objective C运行时之上运行,这意味着我们可以完全访问这些功能。 可悲的是,在Swift中使用它们确实很痛苦。 我们可以做得更好…… 你好ObjectiveKit ObjectiveKit是用于访问Objective C运行时函数的新Swift框架。 它使自省,修改方法和在运行时创建类之类的事情变得非常容易,以一种对Swift来说尽可能原生的方式进行。 它是如何工作的? 您需要做的就是初始化一个ObjectiveClass对象,该对象的类型是您要内省/修改的类,然后使用ObjectiveKit的众多功能之一。 这是一个简单的示例: 使用Objective C运行时既有趣,有教育意义,又对调试非常有用。 但是,这也很危险-在生产中使用前请格外小心。 检查一下: github.com/marmelroy/ObjectiveKit

使用Swift 3的IOS中的MVVM

当我们为最新的iOS应用程序奠定基础时,想向我们以前的iOS应用程序学习。 我们设定了两个目标: 避免Massive View Controller综合症 尽可能少的重复代码 iOS中的MVVM 自从最近出现更好的架构模式以来,MVC(模型视图控制器)设计模式就已经失去了其作为实际模式的地位。 现在,MVC被臭名昭著地称为Massive(或Messy)-View-Controller模式,其原因是在View控制器中堆积1000行以上的代码非常容易。 甚至苹果公司也以避开其示例代码中的MVC模式而闻名。 MVVM(模型-视图-视图模型)是一种体系结构模式,是MVC的替代方案,它可以使将ViewController的UI特定职责进一步隔离到视图模型变得更加容易。 在MVVM设计模式中, 模型与在MVC模式中相同,它表示简单数据。 视图由UIView或UIViewController对象以及它们的.storyboard和.storyboard文件表示,它们仅应显示准备好的数据。 ViewModel隐藏所有异步联网代码,用于可视表示的数据准备代码以及用于侦听Model更改的代码。 所有这些都隐藏在精心定义的API后面,该API建模为适合该特定View 。 使用MVVM的好处之一是测试,您可以在单元测试中更轻松地对其进行测试,而不会影响UI代码。 现在, 视图 ( UIViewController / UIView )变得更加简单,而ViewModel充当Model和View之间的粘合剂 。 在iOS Swift3中应用MVVM 如果您不熟悉MVVM,并且想深入了解如何在应用程序中实现和使用MVVM设计模式,请深入阅读本文,并附带示例示例。 我们将在此示例上演示iOS MVVM模式的用法。 简短地说,该应用程序显示一个用户列表,每个列表包含一个用户图像,其名称和电子邮件。 示例项目中使用的库: Alamofire:是一个用Swift(版本4.4)编写的HTTP网络库。 SDWebImage:该库提供了具有缓存支持的异步图像下载器。 Mapper:是一个简单的Swift库,用于将JSON转换为强类型对象。 步骤1:设定APIClient RANDOM USER GENERATOR使用的API,不需要密钥和授权令牌。端点是:http://api.randomuser.me/?results=10&nat=e 我编写了一个具有完成处理程序的downloadUser函数 。 JSON数据将以字典数组的形式返回,用于下面的关键“结果”。 步骤2:设置ViewModel。 #1:我创建了从NSObject继承的UserViewModel文件。 这将是我的View Controller中的属性,并由情节提要注入。 #2创建一个标记为@IBOutlet的apiClient属性,该属性将由情节提要实例化。 因为我知道情节提要将注入它,所以我可以使用(!)bang运算符,因为我知道它不会为零。 第3步:设置视图控制器。 用@IBOutlet声明UserViewModel属性,情节提要将实例化此ViewModel对象。 ViewDidAppear:在视图出现后调用-是使用userViewModel属性从API开始加载用户的好地方。 从API下载数据后,重新加载tableView以显示我们检索到的应用程序对象。 步骤4:如何使用情节提要定义Object属性。 从对象库中,将一个对象项目拖到视图控制器上,并将其插入VC的顶部。 […]

iOS 3.11

新: 历史记录备份使您可以在购买新的iPhone或iPad时随身携带所有对话,图像,视频和文件。 有关更多详细信息,请访问medium.com/@wireapp 改进的: 更改网络或脱机/联机不再影响应用程序性能。 Wire会遵循来电的iOS静音状态。 固定: 录制音频消息不再被传入的文本消息打断。 应用图标徽章偶尔显示错误的未读聊天次数。 通过Giphy发送的GIF没有设置动画。 用户注销时,应用有时崩溃。 在极少数情况下,所有参与者都被从聊天中删除,我们重新编写了造成混乱的代码。

[Workshop]导航器视图(快速)

目的 创建一个导航器视图并测试它是否可以导航回到上一个视图 方法 创建UI 2.在第一个视图控制器和导航控制器之间将segue的类型设置为“当前模式” 3.将条形按钮项Item放置到3rd View Controller中。 在第3个View Controller和最后一个View Controller之间将segue的类型设置为Show 测试 点击按钮,下一步 2.单击按钮,项目 3.单击按钮,返回

View Controller的基本生命周期

好的,这是View Controller的基本生命周期。 这是Apple的View Controller文档。 有一些不同的生命周期事件 – loadView 创建控制器管理的视图。 仅在创建视图控制器且仅以编程方式完成时才调用它。 – viewDidLoad 在控制器的视图加载到内存后调用。 仅在创建视图时调用。 – viewWillAppear 只要视图出现在屏幕上,就会调用它。 在此步骤中,视图已定义边界,但未应用方向。 – viewWillLayoutSubviews 调用以通知视图控制器其视图将要布局其子视图。 每次框架更改时都会调用此方法 – viewDidLayoutSubviews 调用以通知视图控制器其视图刚刚布置了其子视图。 视图布局其子视图后,请在此处进行其他更改。 – viewDidAppear 通知视图控制器其视图已添加到视图层次结构中。 – viewWillDisappear 在过渡到下一个视图控制器并且将源视图控制器从屏幕上移除之前,将调用此方法。 – viewDidDisappear 从屏幕中删除视图控制器后,将调用此方法。 通常,您可以重写此方法以停止视图控制器不在屏幕上时不应运行的任务。

踢您的手动迭代习惯

当约翰·巴科斯(John Backus)于1977年在他的ACM图灵奖演讲中问“编程是否可以从冯·诺伊曼风格中解放出来?”时,他肯定比40年后仍为for(i = 0; i < n; i++)写作的人寄予更高的希望。 冯·诺依曼(Von Neumann)编程语言使用变量来模仿计算机的存储单元。 控制语句详细说明其跳转和测试指令; 和赋值语句模仿其获取,存储和算术。 赋值语句是编程语言的von Neumann瓶颈,使我们可以一次单词的方式思考,就像计算机的瓶颈一样。 到2017年,主要的编程语言已经吸收了函数式编程中最实用的思想。 我在这里说服您,使用高阶函数来处理数据集合通常可以使您的意图比手动迭代更清晰。 从描述如何执行计算作为循环增加计数器的副作用,或者通过从键集中索引到字典开始,我们早就应该进行下一步了。 这种命令式风格要求代码的人工阅读者在脑海中模拟计算机的执行。 那是一件坏事! 取而代之的是在抽象阶梯上上移一个梯级,并根据功能组成描述您的计算工作:过滤,转换和减少输入流。 在我遇到的大多数情况下,数据存储在数组或列表中的事实是出于方便。 存储在其中的数据没有真正排序。 数组通常只是最易于键入的集合,因为所有语言都内置了语法糖。 最好将集合一般认为是容纳某些元素的容器。 在处理它们时,请开始考虑符合给定条件的元素集-这就是过滤器应用程序。 是否需要为每个元素计算一些派生值? 这种转换称为映射。 需要整个集合中的一些总价值吗? 那就是缩小或折叠。 学习这些概念,并使用它们更清楚地表达您的意图。 当您将计算作为增加索引的副作用时,了解它需要您逐步执行所有命令。 当您通过功能组合来表达自己的意图时,隐藏错误的空间就更少了。

未来就在眼前– iOS和异步开发

在编程中,我们经常使用异步操作。 这可能包括诸如网络,文件系统,数据库,UI,长时间运行的任务或任何其他I / O事件之类的东西。 在iOS中,我们有许多机制可以处理此问题,包括GCD,NSOperation,NSNotifications,委托和回调。 期货是一种在iOS上不那么常见的结构,但已经很成熟,在其他语言(例如JavaScript和Scala)中更常见。 也称为诺言,延期,任务或异步; 该技术允许您以同步方式处理异步值,将连续传递样式的调用切换为直接样式。 通过使用期货,您的程序将更容易推理,因为不会有太多的嵌套调用。 但是未来到底是什么? 未来是对尚不可用的值的表示。 当您与未来合作时,您将不知道该值当前是否可用。 但是,您可以使用该值,就好像它可用一样。 价值一经获得,将来便会处理您的指示。 期货框架 如果您想在iOS应用中开始使用期货,则可以选择以下两种不同的第三方库: – BrightFutures – PromiseKit – FutureKit – 递延 – 螺栓 根据您选择的库,您将有不同的设计选择可以使用。 例如,Big Nerd Ranch的Deferred库的灵感来自OCaml的Deferreds。 这意味着将来/延迟值不会说明异步操作是否失败。 要表示失败,您需要通过返回Result类型或类似的关联枚举来将其表示为值的一部分。 BrightFutures遵循Scala的承诺和未来,因此有一个隐含的理解,即每个未来都可能失败。 FutureKit和Bolts还包含“已取消”状态,该状态表示用户何时取消了将来/任务并且不再关心结果。 这些库可能具有不同的方法和设计目标。 但是,它们都解决了提供一个接口来表示异步结果并使用异步结果的相同问题。 它们还处理共同的任务,例如一起对期货进行排序,并行运行期货以及在特定线程上处理结果。 因此,让我们深入。 只是基础 使用期货的最基本方法是设置完成处理程序。 只要值可用,就可以简单地执行操作。 要设置处理程序,您可以在将来通过调用onSuccess (BrightFutures / FutureKit), 在 (Deferred), 然后 (PromiseKit)或continueOnSuccessWith (Bolts)来设置延续功能。 这些框架中的大多数还允许您通过调用onFailure (BrightFutures), onError (FutureKit)或catch (PromiseKit)来附加错误处理程序。 […]

技术堆栈摘要3:2017年4月

四月是一个繁忙的月份! 有太多很棒的技术堆栈帖子,以至于我们很难挑选十个。 到4月为止,我们总共有20个热门帖子,其中包括10个隐藏的宝石💎。 来自Netflix , Flipboard , Slack , Twitter , Yelp , Dropbox , LinkedIn,Shopify等的帖子 。 令人惊讶的是,四月份的一个主要主题是移动开发 。 LinkedIn,Yelp和Uber都写了关于Android的用法,而Uber则用Swift分解了对应用程序的重写,Shopify则写了关于构建移动CI系统的文章。 查看以前版本的Tech Stack综述 十大技术栈文章: 我们如何构建Twitter Lite(Twitter) 如果您还没有听说过,那么Twitter Lite是一种“快速且响应迅速,使用较少数据,占用较少存储空间,并支持推送通知和在现代浏览器中脱机使用的功能”,旨在成为您在使用Twitter时使用Twitter的最佳方式。连接速度慢,不可靠,受限或昂贵。 基本上,是精简版的Twitter。 Twitter将其构建为客户端JS应用程序,并使用React,Redux,Normalizr,Globalize,Babel,Webpack,Jest,WebdriverIO和Yarn构建。 作者 : 尼古拉斯·加拉格尔(Nicolas Gallagher) 技术堆栈 : React , Redux , Normalizr , Globalize , Babel , Webpack , Jest , WebdriverIO和Yarn Slack的TypeScript(Slack) 有人在打字TypeScript …事实证明,您一​​直使用的Slack桌面应用程序非常复杂。 这是一个多线程应用程序,使用JavaScript与Windows,macOS和Linux的本机代码进行交互。 Slack希望能够保证一切都能融合在一起,因此他们转向TypeScript […]

开发iOS应用-第2部分

这是示例屏幕截图。 一旦完成开发并为应用商店做准备。 使用Apple开发人员帐户,您可以将您的应用进行测试,然后要求测试人员为您执行测试。 发布: 乐在其中- 在应用商店中发布iOS应用 。 完成此操作后,您将成为iOS的正式开发人员和App的自豪所有者 。 但这当然也是最棘手的部分。 如前所述,在创建iOS应用程序的过程中,我学到了很多东西。 一个主要也是最重要的教训是 不要为这个过程留出一些时间,因为这不是一件容易的事。 我不会在这里涂糖衣。 很难将您的应用程序放入应用程序商店,尤其是第一次。 伙计们,现在不要责怪苹果公司的严格指导方针。 如果要保持App Store清洁,则需要它。 那为什么我说很难呢? 好。 因为要发布应用程序,有很多准则/规则。 这就是您需要的东西, 您将需要完成,运行良好且设计精美的iOS应用。 (当我说设计精美时,我是认真的,Apple希望您遵循他们的《 人机交互指南》 ) 然后,您需要注册Apple Developer Program 。 您将充分利用此功能,并在完成测试版后以及想要认真对待事情时(例如,当您要将应用程序放到应用商店中时)进行注册。(请记住, 每笔费用约为99美元年 ) 在开始发布之前,请仔细阅读《 App评论指南》 。 您不一定必须逐字逐句地进行检查,但是如果这样做,那就很好了。 虽然您开发了出色的iOS应用程序,但Apple会对您的产品进行评论,他们也必须有同样的感觉。 一旦他们批准了您的应用,该应用就会在应用商店中启动。 很多事情都会出错,但是最重要的是将应用程序带到商店 。 所以你不敢放弃。 预留大约2周的时间进行发布。 您可能需要与Apple团队来回交流,否则您可能会在第一次遇到问题。 但是要留出时间。 Apple的应用程序审查团队非常明确,可以让您知道他们对在应用程序商店中发布该应用程序的期望。 因此,与他们沟通并获得所有需要的清晰度。 苹果承诺将在24小时内对任何请求做出答复,最多2个工作日,并且他们确实做到了。 快速提示: 确保在Xcode中调试应用中的所有可能错误。 没有警告信息 ! 如果您上传的版本不是beta版本 ,则在应用程序或其描述中不会提及“ beta […]