Tag: iOS应用开发

在Big Nerd Ranch迅速涉足:iOS Essentials训练营评论

免责声明:这不是赞助评论。 大书呆子牧场没有联系我做任何形式的认可。 所有表达的意见都是我自己的。 那不是夸张。 如果您确定要成为iOS开发人员,并且想学习Swift语言的基础知识以及如何在尽可能短的时间内智能设计iOS应用程序,那么Big Nerd Ranch的带有Swift Bootcamp的iOS Essentials就是您的最佳选择。 该课程将花费您$ 5200($ 4680,学生折扣)和整整一周的专心致志。 这是一笔不菲的金钱和承诺。 对我来说,这是值得的。 我借了一笔贷款,将偿还全部4680美元以及我飞往那里的356.39美元的利息。 实际上,我很高兴我必须偿还这笔款项。 这是达到更高,更聪明地工作而不是为了更少而满足的动机。 关于我的一些背景以及我决定参加该课程的原因:我是二十一岁的大学高级双学位,主修计算机科学和经济学,并且拥有两年的主要C语言风格的编程经验。 毕业后我想成为一名iOS开发人员,但是我的学校不提供任何Swift或移动开发课程。 我曾经进行过一次iOS开发实习,并意识到结束之后,我有足够的发展空间作为一名工程师。 我的雄心勃勃的目标是:不仅“学习更多Swift”并“成为一名更好的工程师”,而且真正了解语言,其习语,模式以及按原样设计iOS应用程序的原因 。 我度过了愉快的时光,可以坚定地说,我从这个密集​​而密集的一周中学到的东西比在整个学期的学期里学到的更多。 但是,我只能从课程中学到很多东西,因为我以前的编程经验(以及我的顾问,教授和同学的坚定支持)奠定了相当坚实的基础,并且我知道吸收这些东西对我有用并保留新信息。 不要期望参加,不花力气,而会成为一个知识渊博的开发人员-拿出自己所要投入的东西,尽管您总是会得到帮助,但没有人会牵着手课程。 环境 该课程在佐治亚州石山的万豪常绿会议度假村举行(或者至少是在艾尔玛决定让我们参观之前-以后再介绍她)。 我们的课程在酒店的其中一间会议室内举行,该会议室配有标准配置的书桌,投影仪和翻转板,供教员在上面写字。 有各种各样的小吃和冰箱,里面装有饮料,以防在上课时有人需要点心(相信我,我们做到了)。 我们住过的实际酒店房间超级好 。 我的大学生对“豪华”的定义是自己有一个睡觉的空间。 在Evergreen,我得到了一个带两张床的房间,一台电视,一个壁橱,一间私人浴室,以及我自己的阳台,可在酒店旁边欣赏湖泊的壮丽景色。 当您坐在室外并欣赏湖泊和高大的树木映衬在粉红色,蓝色和黄色的天空下时,日出时起床还不错。 房间,我们所有的饭菜以及往返机场的交通都包含在班费中,这意味着我不得不沉迷于酒店的自助式餐厅。 这里的食物可与其他餐厅媲美,工作人员非常友好和周到,而且我们还有一些保留的桌子供我们自己使用。 在整个星期的中途,飓风“艾尔玛”(Hurricane Irma)受袭,而常绿树失去了力量。 导航楼梯间到我的房间并在黑暗中洗个澡真是一次冒险。 班上有人告诉我们,我们将搬到佐治亚州莱诺克斯的JW万豪酒店。 这次,我的房间是第12楼的套房之一。 我有一张巨大的床和一间带两个镜子,淋浴和一个浴缸的私人浴室。 JW的会议室更宽敞,我们从菜单上点菜而不是选择自助餐。 班上有一些关于哪家酒店的设施更好的争论,但是我坚决支持JW。 我的意思是,什么时候我还能有机会在凌晨2点炸开Lana del Rey时享受豪华的沐浴并吃葡萄番茄? 班级规模/结构 该课程中只有一名讲师,一名助教和大约十二个人。 我们所有人都有大量的以前的编程经验; 大多数人已经作为开发商工作,并已被其雇主派往那里。 上课时间为上午9点,结束于下午6:30,分别有一个小时的午餐时间和30分​​钟的下午休息时间。 我们研究了Big Nerd Ranch […]

Swift,Plist和两个吸烟脚本

从iOS 10开始,开发人员应提供有关使用用户私人数据的描述,否则应用程序将崩溃。 但是,如果将value字段保留为空,则所有操作将一直有效,直到您将新的版本发送到iTunes Connect。 该构建消失,您(或您的客户)收到有关该构建的电子邮件: 亲爱的开发人员, 我们发现您最近为“您的应用”交付商品时遇到一个或多个问题。 要处理您的交货,必须更正以下问题: 缺少Info.plist键 -此应用尝试访问对隐私敏感的数据,而没有使用说明。 应用程序的Info.plist必须包含NSCalendarsUsageDescription键,该键具有字符串值,该字符串值向用户说明应用程序如何使用此数据。 解决这些问题后,您可以重新交付更正后的二进制文件。 问候, App Store团队 至少有三种检查方法: 手动检查。 绝对不会。 编写fastlane车道。 如果您已经使用fastlane并且了解Ruby,那么这是一个很好的方法。 Fastlane也支持Swift,但具有其他Xcode项目。 编写构建阶段脚本。 那是我的兄弟! 有很多很好的Build Phase示例:用SwiftLint整理代码,为CocoaPods框架复制资源等。大多数都是用Bash编写的。 但是等等,斯威夫特呢? 我可以使用Swift编写脚本吗? 除非您是此设备的幸运所有者,否则: 没有语法突出显示和自动补全 无法将脚本重复用于多个目标。 您必须将脚本代码复制粘贴到每个目标,并在每个副本中进行更改。 让我们为脚本创建一个单独的文件: mkdir Scripts touch Scripts/usage_description_check.swift 不要忘记通过更改其权限使脚本可执行: chmod +x Scripts/usage_description_check.swift 接下来,添加带有该脚本路径的Build Phase脚本: 注意:选中“仅在安装时运行脚本”标志以仅在存档操作期间运行它。 我们的旅程已经开始! 🚀 将此行添加到脚本文件的顶部: #!/usr/bin/env xcrun –sdk macosx swift 该行首先启动Swift REPL(Read-Eval-Print-Loop),其余脚本实际上是在Swift环境中编译的。 注意–sdk选项。 默认情况下, […]

移动开发:2018年2月iOS上的5大热门文章

这是我第一次决定建立在Mobile Development Digest中发布的热门资源列表。 如果您愿意的话,将来我会继续在iOS和Android领域中名列前五名。 该列表已通过阅读2018年2月发布的《移动开发摘要》问题的统计数据进行合并。 从2017年的Swift顶级文章中学习iOS编程。这是很多不错的文章,它们可能会帮助您总体上掌握Swift和iOS开发。 为什么我要在一周内自己的顶级文章摘要中放入另一个顶级文章列表? 好吧……MDD结合了我认为很有价值的文章,但由于我目前的项目和知识水平,我选择它们。 但是,MDD的目标是提供完整且尽可能广泛的工具,框架和文章集。 万一Mybridge写了一篇文章,很难否认他们做得很好,而且结果可能对所有iOS开发人员都有用。 Moya入门。 Moya是一个Swift网络抽象库。 如果仅处理一个项目或已经具有抽象级别,则可能不需要使用它,但不要忽略源代码。 Moya经常使用“敏捷”方法,您可能会从其代码中学到很多东西。 用compactMap替换flatMap。 一些Swift解释了即将发布的Swift 4.1和XCode 9.3对flatMap的更改 自上而下的iOS错误架构。 还有一种尝试发现iOS上的错误处理主题。 此方法类似于触摸处理事件,但用于错误。 更好的初始化程序和默认参数。 Swift的另一部分显示了强大的键路径以及更好的对象初始化方法。 最初发表于ALSEDI

在iOS App中构建可重用的通用UITableViewController

TableView Controller是一个必不可少的UIKit组件,几乎每个iOS应用程序都使用TableView Controller组件来显示列表中的数据。 当我们要在UITableViewController显示不同类型的数据时,大多数时候我们会创建一个新的子类来显示相关的数据类型。 这种方法有效,但是如果我们的应用程序中有许多不同类型的数据,则可能导致重复和维护困难。 我们如何解决这个问题? 一种方法是,我们可以使用Swift通用抽象数据类型使用简单抽象来创建通用UITableViewController子类,该子类可用于使用Swift通用约束配置和显示不同种类的数据。 您可以在GitHub存储库中找到并构建源项目: alfianlosari / GenericTableViewController 通用UITableViewController实现的示例– alfianlosari / GenericTableViewController github.com 我们创建一个名为GenericTableViewController的UITableViewController子类,并添加2种类型的Generic T和Cell 。 我们添加了约束,即Cell必须是UITableViewCell子类。 T将用作数据的抽象,而Cell将被注册到UITableView并出队以将每行的数据显示为UITableViewCell 。 类 GenericTableViewController :UITableViewController { 变量 :[T] var configure:(Cell,T)-> Void var selectHandler:(T)-> Void init (items:[T],​​配置: @转义 (Cell,T)-> Void,selectHandler: @转义 (T)-> Void){ 自我 .items =项目 自我 .configure =配置 自我 .selectHandler = selectHandler 超级 .init(样式:.plain) self […]

Swift中的SOLID原理

SOLID是罗伯特·C·马丁(Robert C. Martin)在软件编程中使用的助记词缩写,它表示面向对象编程的5条原则。 单一责任原则 O笔已关闭 利斯科夫的替补 接口隔离 倾向倒置 这些原则解决了糟糕的架构问题,例如 美味佳肴 -某个地方的更改会破坏意外的部分,如果没有良好的测试覆盖范围,则很难跟踪。 固定性 -组件很难在另一个项目中重用或在同一项目的多个位置中使用,因为它具有许多依赖性。 易怒 -进行大量更改,因为它会影响多个部分。 这些SOLID原则不是严格的规则,而只是提高体系结构质量的准则。 让我们一一探究原理

从NSCoding迁移到Codable

对于迟到的用户:Apple 在Swift 4中 引入了 Codable 协议,该协议使您可以将模型类型编码和解码为JSON和属性列表等数据类型,并且可以用来代替 NSCoding 协议来存档数据。 首先,此Codable协议有什么Codable ? 当我们已经有了NSCoding时,学习一种新方法真的值得付出努力吗,这种NSCoding多年来一直可以很好地归档数据? 而且,如果您查看同时实现这两种类型的类型,则它们非常相似。 假设我们有一个Product类型,其中包含标题,价格和数量: 所以-如果它们是如此相似,何必呢? 好吧,有几个很好的理由: 您可能已经注意到, Codable示例中的Product类型是结构而不是类-不必一定是,这只是因为实现Codable协议的类型不需要子类化(提醒NSCoding类型必须是NSObject子类,因此必须是一个类),它们可以自由地为任何类型-类,结构甚至枚举。 动力! 尽管在本文中我主要关注归档到磁盘,但是Codable协议不仅对归档有用,而且对将数据编码或解码为不同的数据类型也很有用。 在撰写本文时,其中包括JSON和属性列表。 如果您只想编码或解码(例如,您可能只是从远程API接收和解码数据),则可以简单地采用Encodable或Decodable协议。 Codable任何具有Codable经验的Codable都可能会在屏幕上大喊大叫! 因此……可Codable协议的Codable在于它具有自动生成其所需方法(编码和初始化)和CodingKeys枚举的能力。 如果您对类型中的Codable属性进行了简单的编码/解码, Codable可以将其省略,并允许编译器自动生成它们,哇! 自动生成很棒,但是在某些情况下,您将需要放弃自动生成的便利,而手动组合其中的一个或全部。 例如: 类型的一个或多个属性可能不是Codable 。 在这种情况下,您需要将其与Codable类型相互转换。 类型的结构可能与您要编码/解码的结构不同。 您可能需要编码和解码不同于类型属性的属性。 您可能要对类型的属性使用不同的名称。 我们已经看到了如何定义模型类型进行比较,但是实际数据归档如何进行比较? 这是使用NSCoding归档和取消归档Product类的数据: 这是由于两个因素: 编码和解码可能会在Codable协议中引发错误。 这是一件好事–这意味着您的应用在使用Codable协议进行编码和解码时不太可能崩溃。 在将数据类型传递到存档之前,您需要手动请求使用自定义编码器对数据类型进行编码。 (对于解码和取消存档也可以相反。) 因此,您可以看到实现Codable协议与NSCoding协议Codable具有其优势。 问题是–我们该如何处理使用NSCoding旧项目? 好吧,当然,我们无能为力。 Apple尚未宣布他们不赞成使用NSCoding ,因此您应该继续使用它。 但是,如果您希望将代码更新为更现代的Codable协议,该如何……? 如果仅将NSCoding类型切换为Codable类型,然后在具有预先存在的NSCoding数据的设备上运行该应用程序,则该应用程序尝试将其归档为Codable数据时,不仅会失败 ,还会因Codable而崩溃 。 对于您的忠实用户而言,这是一场灾难! 一种解决方案是同时采用Codable和NSCoding协议。 旧用户第一次使用该应用程序时,将使用NSCoding协议检索数据。 他们随后保存数据的任何时间,他们都将使用Codable协议进行保存,并且此后将仅通过Codable协议访问其数据。 在不远的将来,您可以决定不再支持使用NSCoding存储的数据。 同时采用NSCoding和Codable协议非常简单。 […]

为什么像Explorica这样的应用程序在App World中占据一席之地?

随着技术的进步,所有行业的格局都发生了变化。 旅游行业也不例外。 eMarketer最近进行的一项调查显示,基于旅行的移动应用程序是下载次数排名第七的应用程序类别,大约有60%的智能手机用户在计划旅行时使用旅行应用程序。 有了数字工具,用户现在更喜欢这些便携式和用户友好的旅行移动应用程序来自行安排行程。 旅游行业应用程序的一些有趣事实 ·85%的人在休闲旅行中使用智能手机计划行程 ·30%的人使用移动应用找到最优惠的酒店 ·15%的人使用下载的旅行应用来计划未来的行程 ·与旅游相关的应用程序在应用程序中排名第七 其他目的游客将旅行和旅游移动应用用于 ·使用地图功能-49.1% ·搜索餐厅— 62.1% ·使用GPS导航-48.1% ·搜索酒店— 46% ·搜索引擎的活动和景点-33.3% ·寻找公共交通工具-12.6% ·购物-36.1% ·搜索酒店— 11.2% 我一直在使用许多旅行应用程序来计划行程,位置和搜索附近的位置。 并且说实话,几乎所有的人都提供类似的功能和建议。 虽然大多数用户体验落后,但我特别喜欢Explorica这个应用程序。 它具有许多我喜欢的功能,其快速的UI / UX迫使我使其成为搜索和旅行计划的默认应用程序。 Explorica对于在城镇之间旅行的用户很方便。 借助其使用GPS位置通过地图和距离计算器准确定位最接近您的地点和地点的能力,您可以在旅途中或旅途中进行选择。 无论您是计划去城市旅行还是只是在附近寻找餐馆,使用此应用程序,您都可以通过查看地图和GPS跟踪来到达那里。 特点: •使用GPS自动定位和通过搜索来更改城市/城镇的选项 •在世界任何地方均可使用 •为了方便用户,该地点的完整详细信息如电话号码,附近地区,地址,图像,评级工作时间,网站等 •使用KM跟踪距离(以KM为单位)和到达时间,以找到感兴趣的地方 •使用等级/距离和地点图片在地图或列表上查看搜索结果 •位置搜索结果的即时搜索和收藏夹 •为了方便用户,对食品,保健,金融,运输,政府,娱乐,购物等场所进行了分类 •城镇天气更新 •选择距离(5KM)之内的地点 •与Google Maps集成以进行准确的位置搜索 •在地图上获取感兴趣的地方的方向 此Explorica应用程序完全免费下载和使用。 它是由一家名为KNOWARTH Technologies的公司开发的,该公司正在为最终用户开发其他几种应用程序。 因此,我建议您使用这个免费的应用程序来搜索,定位和评价您周围的地方。 参观热门的餐馆,酒店,电影院,ATM和杂货店,使Explorica成为您的私人旅行顾问和位置查找器,以查找您周围的所有事物。 您可以在两家商店免费下载此应用程序: 苹果商店 Android Play痛

SWIFT 4,审查新

2017年9月19日,Apple在Swift语言的官方博客上宣布了(链接为外部)Swift 4.0版本。 好消息是,新的Swift不像Swift 3.0那样包含许多史诗般的更改,并且大多数更改具有完全的向后兼容性。 因此,您可以放松休息一下,让我们快速浏览所有创新。 1.单边范围 添加了RangeExpression协议以简化使用范围的方法的创建。 此外,标准库还可以从现在开始检测范围的开始和结束索引,因此您无需显式指定它们[SE-0172] 阅读全文: Swift 4,回顾新| Sigma软件 2017年9月19日,Apple在Swift语言的官方博客上宣布了Swift 4.0的发布。 好消息是…… sigma。软件

Swift编程语言:iOS开发的利与弊

iOS是世界上两个最受欢迎的开发平台之一,这就是为什么一些公司只为iPhone开发软件产品的原因。 在为iOS开发时,有时可能难以选择必要的技术堆栈。 您还需要确定是要跨平台开发还是要进行更简单的本机开发。 在语言方面,您可以使用较旧的Objective-C或最近出现的Swift。 由于Objective-C已经存在了一段时间,因此在本文中,我们将重点介绍Swift中的编程。 什么是Swift编程? Swift大约是在五年前推出的,从那时起,它得到了一家大公司的支持,它正在成为iOS上开发的主导技术。 它是一个开源工具,具有庞大的支持社区和各种各样的第三方工具。 这一切始于2014年,当时苹果公司的一位顶级工程师克里斯·拉特纳(Chris Lattner)只是为了娱乐而乱花钱。 在苹果公司的一些同事发现了这一点之后,他们非常兴奋地尝试了一下。 他最终将在2014年全球开发者大会上继续介绍这种新语言,并开始受到欢迎。 2019年最值得学习的编码语言–数据驱动的投资者 在我作为本科生的那几年,我跳过了许多晚间聚会,而不去学习Java,希望它有一天能帮助我取得成功…… www.datadriveninvestor.com 斯威夫特是一门好语言 Swift是一种非常好的语言,因为它不仅是流行的开源工具,而且非常安全,因为设计本身会鼓励开发人员一致地编写清晰易读的代码。 也许它的主要优势是速度。 实际上,在比较Swift和Objective-C时,确定Swift的速度是2.6倍,在与Python的激烈竞争中,Swift的速度是8倍。 实际上,目前,我们正在见证将主导软件开发的一项巨大技术。 有了Apple的支持,确实可以迅速提高信誉,并提高其知名度。 Swift编程的优点 除了使用Swift进行iOS应用开发带来的明显好处之外,还有一些其他优点: 更好的可伸缩性-Swift非常适合在产品中添加功能,也可以在开发团队中添加新成员。 由于该语言促进了简单性,因此您可以根据需要向团队中添加其他开发人员,并让他们开始工作,因为它具有很高的可读性。 互操作性—想象一下,您有一个使用Objective-C构建的大型项目。 可以使用相同的代码库对应用程序进行所有需要的更新,并且由于我们已经知道Swift的可伸缩性,因此如果需要,还可以添加一些功能。 完全的堆栈潜力-IBM一直在积极推动Swift在云中可用,这一决定显示出巨大的好处。 服务器端Swift可以与任何技术集成。 如果您同时使用Swift进行前端和后端开发,则可以更好地共享您的代码,从而使开发过程更快。 使用Swift的缺点 尽管到目前为止,关于Swift的一切说法都是积极的,但仍存在一些Swift编码方面的挑战: Swift是相对较新的-自从Swift最近爆发以来,注定会有一些成长的烦恼。 没有太多的工具或本机库,较旧的工具与新版本的Swift不再相关。 几乎不支持早期的iOS版本-您只能在iOS7和更高版本的应用程序中使用Swift。 也就是说,Swift不能用于在较旧版本的操作系统上运行的旧项目。 但是,目前约有5%的Apple设备运行iOS6或更早版本。 人才短缺—尽管Swift社区正在迅速发展,但它仍然比其他开源语言小得多。 实际上,根据Stack Overflow进行的一项调查,在接受调查的78,000名开发人员中,只有8%的人表示他们使用Swift。 我们希望本文对您决定在开发下一个应用程序时是否使用Swift编码语言很有帮助。 在苹果公司的支持下,随着时间的流逝,Swift肯定会变得越来越流行,并且消除路上的所有麻烦和颠簸。 Swift的创建恰恰是顾名思义:极快,高效和可扩展。

像老板一样进行测试— RxSwift简介

在此处阅读全文 在最近的几篇文章中,我们一直在研究Streams –随时间变化的值。 掌握起来并不是很困难,我们一直在努力将它们集成到View Model中。 硬币的另一面虽然正在测试我们的代码。 我们如何使用RxSwift测试反应式代码? 我们使用一个名为RxTest的库。 RxTest使我们可以访问测试计划程序。 调度程序就像一件工作,通常我们将在特定线程上运行它,例如在先前的文章中,我们使用主调度程序实例将后台工作移至主线程上。 这里唯一的问题是序列添加到Rx思维方式的同一件事:时间本身。 流可以随时接收事件,因此,为了模拟我们只是伪造它们出现的时间,但是我们对顺序进行了具体说明。 更好的是,我们有一个网络呼叫需要20秒,我们可以伪造20秒而不必等待那么长时间的嘲笑。 考虑带有Rx的视图模型的一种好方法是输入需要提供的输入以及它们将产生的输出。 自然,我们想在此处测试输出,但是输入可能是搜索栏的文本值,这会触发网络调用,并且视图模型会公开我们可以测试的输出值。 它可能是结果列表,或者在这种情况下是String。 现在,让我们看一下如何进行视觉测试: 如你看到的。 视图模型具有输入和输出,这两个输入和输出都可以通过某种方式使数据突变。 就像工厂一样,数据被“绑定”到其中,它被更改并在最后创建一个可观察的对象作为输出,除了我们想在最后订阅该输出。 让我们看一个例子: 在测试目标中,请确保导入RxSwift,RxTest以及项目的@testable导入,以访问其视图模型和其他类似的类: 导入XCTest 导入RxSwift 导入RxTest @testable导入YourAppName 类YourAppName:XCTestCase { 我仅在此项目中使用CocoaPods,但您需要分别导入RxSwift和RxTest。 类ViewModel { //这是我们将向其发送输入的公共属性。 也许这可能是搜索栏的文本或标签的文本值。 公共变量输入:BehaviorSubject = BehaviorSubject (值:“”) //这是我们将测试的输出值 惰性var输出:BehaviorSubject = BehaviorSubject (值:“”) 让disposeBag = DisposeBag() //简单的初始化即可自动自动调用我们的订阅 在里面() { setupBindings() } //订阅更改的简单函数 私人功能setupBindings(){ input.subscribe(onNext:{[弱自我]值 self?.output.onNext(“更改的\(值)”) } […]