类,结构和枚举至少需要一个空的init方法来初始化以准备其实例。 对于结构和枚举,其构造函数已隐式声明。 关于类,如果我们编写一个类,则应该显式声明它。 好吧,对吧? 但是,一个类具有Inheritance ,这意味着它可以继承其超类的方法,属性和其他特征。 让我们继续下面的下一个代码 我们有一个类B –类A的子类。我们添加了一个变量,并添加了一个初始化程序,将其值设置为b以便进行编译。 您可能希望B继承了A的初始化程序init(a: Int) 。 但事实并非如此。 A的init(a: Int)如何知道如何为B添加的b变量赋值? 没有。 因此,我们无法使用无法初始化我们所有值的初始化器来初始化B实例,如下所示: 因此,如果我只想初始化a或b值,则使用其余的默认值。 怎么可能 便捷的初始化将帮助我们,添加以下代码 因此,我们有一个非常方便的方法来初始化B实例。 而已! 希望您喜欢这篇文章,感谢您的阅读,下次再见。
我们非常高兴与您分享我们的新系列专业iOS工程第1季的发布-在Essential Developer的Youtube频道上使用TDD和模块化设计构建Swift应用 。 在Caio和Mike的一对编程系列中,将演示测试驱动开发的原理, 模块化系统的功能以及如何满足未来的需求 。 他们保持可持续的发展周期,并不断思考如何提高效率,同时注意技术优势和良好的设计 。 该系列专为希望将其技能提升到更高水平的专业人士和有抱负的iOS开发人员而创建。 Caio和Mike尝试推理并解释他们做出的大多数决定,并努力为问题提供多种解决方案。 立即订阅我们的Youtube频道, 每周获取免费的新剧集,并在Github上关注该项目的进展。
VIPER介绍 如果您开发iOS应用程序已有一段时间,您会注意到大多数逻辑都放在UIViewController的子类中。 通常将其称为Massive ViewController问题。 视图是一个简单的对象,仅关心在屏幕上绘制自己。 模型是无用的数据存储,可以用简单的集合或复杂的数据结构表示。 基本上,所有其他逻辑都应该放在这个可怜的孤独ViewController中。 它将模型对象转换为更多对视图友好的状态,反之亦然。 它还处理用户输入,获取数据,进行网络调用,分配和显示其他ViewController。 所有这些乐趣都归于ViewController是否公平? 不仅ViewController的可读性受到额外的负担(在代码行中),而且可测试性,可维护性和重构速度也受到影响。 考虑到Swift瞬息万变,Apple每年都会发布新的iOS,因此维护和重构ViewControllers是您作为iOS开发人员的重要工作。 可测试性在这里非常重要,因为您不希望那些可怕的回归。 因此,一些聪明的人决定以ViewController基本节食的方式改进MVC(模型-视图-控制器)。 MVVM(Model-View-ViewModel)是第一次尝试。 它使ViewController无需在模型对象(如果愿意,可以选择业务对象)之间转换为对视图友好的对象(从现在起将它们称为ViewModels)即可。 这种方法提高了可测试性,并使ViewControlles更加精简,但这是否足够? 它不涉及对动作,网络,导航等的响应。 因此人们决定他们还需要从其他东西中释放ViewController。 首先,他们创建了Presenter (在MVVM的情况下为ViewModel)。 此类负责更新用户界面。 它接收业务对象并将其转换为ViewModels。 它从哪里接收它们? 来自另一个称为Interactor的类,该类负责从任何可能的地方获取业务对象:网络,持久性存储,并将它们传递给Presenter。 它还负责响应用户的操作。 因此,当您按下登录按钮时,ViewController会将其传递给Interactor并进行网络调用(通常,您想在一个单独的对象中进行此操作,更多信息在下面的内容中),等待响应,然后确定下一步需要执行的操作。 因此,当Interactor做出此决定时,它将调用另一个称为Router的对象(您可能会在某些文章中找到Wireframe ),该对象执行监视或以模态形式显示ViewController。 因此,您可能会问ViewController还剩下什么? 除了与Presenter通信外,它还可以管理很多事情。 由于我们在UIKit的领土上玩游戏,因此我们无法摆脱它的影响。 我相信您应该将ViewController分配为各种事物的委托和dataSource。 这样,您就不会在Interactor上做一些疯狂的事情。 不要试图破坏UIKit。 这是不可能和不必要的。 因此,我们有V表示视图 , I表示交互器 , P表示主持人 , R表示路由器 。 那么VIPER中的E代表什么? E代表Entity 。 实体基本上就是您在MVC中所说的模型 -枯燥的数据存储。 就我个人而言,我觉得将它放在VIPER中只是为了使其听起来很酷。 您的Interactor将从各种来源获得这些实体 ,但还将使用Services (封装此类任务的对象)进行网络调用或执行一些长期任务。 例如,您可以在ToDoList应用中创建TasksService (每个iOS开发人员都应该创建一个) […]
这是一系列文章的第二部分,介绍了如何使用许多不同的Pod和工具从头开始创建iOS应用,从而使您的生活更轻松。 如果您错过了第一部分,则可以在此处进行检查。 在这篇文章中,我将讨论测试,覆盖率报告,如何使用Fastlane自动化流程以及更多内容。 该项目的源代码可在此存储库中找到。 我为此帖子创建了一个名为v0.2的标签,您 只需克隆存储库并切换到标签v0.2。 初始步骤.. 首先,我们必须确保项目具有单元测试目标,如果不是这种情况,我们可以通过单击文件>新建>目标来创建目标 测试盒.. 为了正确创建测试,我将使用几个不同的测试库。 在编写测试的过程中,它们可以为我们提供很多帮助,因此,请将它们添加到我们的Podfile中。 在下面,您可以看到类似Pod的容器:Quick,Nimble,Fakery。 这些吊舱将大大增强我们进行测试的方式。 该测试并没有做太多事情,只是产生了一个期望,即true是true,并且总是会成功。 它看起来很简单,却有更大的用途。 这个断言可以告诉您一切都已正确配置和设置。 到目前为止,仅使用XCTest编写测试的人可能会感到奇怪,这种编写测试的方法是使用Expect而不是XCAssert来描述和创建断言。 但是,它更接近自然语言,因此到目前为止,它可以大大提高测试的可读性。 这就是为什么人们选择这种方法后,经过学习之后,它使编写测试变得更加容易和直观,从而增加了测试在项目中的采用率。 可以肯定的是,如果很难编写测试,则没人会编写! Quick和Nimble等测试框架的最终目标是充分降低学习曲线,以确保人们编写测试。 接下来..自动化,然后再添加复杂度.. 在添加任何其他测试之前,请确保我们可以运行测试并从cmd行生成代码覆盖率报告。 这样做将确保我们正确设置所有内容,而复杂度仍然较低。 这是一种安全的措施,如果有什么不对劲,我们可以减少要找出正在发生的事情的要点。 这一步非常重要,通过使我们的开发流程自动化,我们可以放心,以后再插入连续集成过程将更加容易。 Fastlane是一个了不起的工具,可以为我们提供帮助,我们可以使用它的“扫描”操作来运行测试,然后使用Slather生成测试覆盖率报告。 抱着你的马..首先更多的设置.. 在进行自动化过程之前,让我们确保每个人都在正确的页面中,这意味着,确保我们使用的是预期的快车道,cocoapods等版本。我们可以通过在项目中采用Bundler来做到这一点。 让我们创建一个像这样的Gemfile: 用Fastlane自动化.. Fastlane非常直观,我们需要做的就是运行其cmd并完成设置步骤。 完成此操作后,您会注意到一个名为fastlane的新文件夹,其中包含一些文件。 现在,让我们仅关注fastfile。 图为标签v0.2上的项目覆盖率报告, 97.16% 的确不错! 到达那里.. =) 现在,测试.. 让我们从模型层开始,确保在我们的情况下可以使用它们来映射api响应,因此我们必须有一种在测试中加载json并从中创建模型的方法。 为了做到这一点,我们将在测试目标中创建一个名为MockLoader的帮助程序结构。 下一步是创建第一个真实规范,让我们创建一个CharacterSpec,以测试我们的第一个模型。 这里没有太多事情要做,但是即使是这个小小的测试也可以证明我们的模型可以用来解析我们的api响应。 即使任何一次api调用都经过一次,我们也可以放心地声明。 这就是强大而有用的测试。 手动测试这种事情,没有自动化测试,这是不好的并且容易出错。 一路上有很多地方,事情可能会横着走,并表现出异常情况,例如互联网问题,网络层问题,api调用错误等。测试可以帮助我们避免所有这些,专注于我们真正想要的东西的情况下,有一种方法可以从json创建模型。 我不会涵盖该项目中的所有测试,否则这篇文章会很大。 但是,我强烈建议您克隆项目并检查所有项目。 现在,让我们继续进行下一种测试,即视图控制器。 测试ViewController .. 一个更大的例子,还有很多事情要做。 我将设计要点,并讨论一些重要的部分。 […]
今天,我们将讨论自定义视图,特别是工程图视图。 什么是视图? 基本上,我们使用这些分层的矩形视图来构建UI。 视图可以有许多子视图 ,但只能有一个子 视图 。 如果您从计算器应用程序中回想起,我们的堆栈视图包含按钮的子视图,甚至其他堆栈视图。 我们可以使用Xcode中的界面生成器来构建视图,也可以通过编程方式来构建视图。 UIViewController中有一个重要的属性,称为view ,它是窗口中的顶级视图。 请注意,当该视图旋转时,其边界将改变。 然后,我们就有机会更改此视图中的所有子视图。 此功能使我们可以根据设备的方向或大小指定视图的关系。 通常,尽管我们不需要此视图,因为我们倾向于将视图添加为可以直接使用的出口(@IBOutlet)。 那么我们如何初始化UIView? 好吧,如果您还记得在Swift中,类的初始化有很多规则,那么我们会尽量避免使用它们。 但是,如果我们不能避免它们,则有两种初始化UIView的方法,我们应该注意。 初始化(框架:CGRect) 如果我们以编程方式创建视图,则使用上述初始化。 如果我们选择使用接口构建器在Xcode中创建视图,则可以使用以下初始化: 初始化(编码器:NSCoder) 这个编码器是关于什么的。 好吧,我们使用界面生成器创建的所有视图都被编码为XML文件。 当我们运行程序时,该XML文件将被加载,并且基本上包含有关如何创建这些对象的说明。 如果我们需要一个视图初始化器,则需要实现这两种方法,以便无论是在代码中还是在Xcode中创建视图都可以初始化。 设置我们的视图的另一种方法是awakeFromNib ,该视图只有在界面构建器中创建后才能起作用。 每当我们在视图中处理与绘图有关的任何事情时,我们都会使用CGFloat类型。 CG代表核心图形。 CGRects还有很多其他便利方法,我们应该很好地熟悉它们。 让我们看一下坐标空间。 我们将看到它不是笛卡尔坐标系。 在笛卡尔系统中,上升意味着增加y坐标的值。 在这里是不同的。 请注意,我们处理的是点 ,而不是像素 。 像素就像是可以在屏幕上显示的最小的光线。 一些设备的每个点有很多像素,这意味着像素被密集地包装。 这很棒,因为这意味着当我们查看曲线(如字体)时,它们不会出现锯齿状的边缘。 想想Retina显示屏上当前的Macbook和iPhone。 由于每个点压缩了多少像素,我们不能使用像素作为绘图单位,因为在密集压缩的像素设备上,我们的绘图看起来非常小,而在轻度压缩的像素上,绘图或图像会显得更大。 因此,我们得出了结论。 所有UIView中最重要的属性是 bounds 。 其余两个属性 center 和 frame 与边界混淆了,但是它们与绘制位置(边界)无关。 框架和中心与我们所处的位置有关。 底线是永远不要使用框架和中心绘制。 它们仅应用于将您置于您的超级视图中。 […]
iOS在包括美国,英国,加拿大和澳大利亚在内的全球多个主要市场中占据主导地位,被认为是商务应用程序的首选移动平台。 实际上,就应用程序收入和采用率而言,iOS已证明胜过其主要竞争对手Android。 然而,新兴技术将iOS应用程序开发的快速性和可用性提升到一个新的水平。 忽略它们对于每家现代公司来说都是判断失误。 选择合适的技术栈是构建iOS应用程序时需要做出的最重要的决定之一。 这就是为什么在过去的几年中,Objective-C与Swift的困境一直是人们讨论的热点。 背景 Swift是Apple创建的一种通用而强大的编程语言,它是Objective-C的现代替代品。 自2014年正式发布以来,Swift经历了很长的路要走,从引起争议和经常受到批评到成为最受欢迎的编程语言和最受追捧的技术技能。 该语言主要用于构建iOS,Mac,Apple TV和Apple Watch的应用程序,已被iOS社区的开发人员迅速采用。 随着苹果公司最近的“大动作”,开源其全新的编程语言,在iOS开发人员社区的共同努力下,Swift有望实现更快的增长。 许多最有才华的开发人员都在早期采用Swift,并将当前的项目转移到它上,这对于如此年轻的技术而言是非凡的。 但是,它的前身似乎不会很快失去立足点:Indeed.com代表的趋势表明对Objective-C开发人员的稳定需求。 因此,至少到目前为止,这两种语言将继续在iOS生态系统中共存。 只要使用最新版本的语言,使用Objective-C(或与Swift结合使用)运行应用程序构建就可以了。 除此之外,完全在Swift上构建新应用程序有多安全? 这种方法有什么好处? 通过使用实际案例和具体示例,以下信息包含了我们对Swift必须提供的好处的看法。 Swift的好处:为什么要为新项目选择Swift? 1. Swift应用程序快速且高效 从一开始,Apple就将Swift定位为一种快速,轻量级的语言(嗯,它的名字不言而喻)。 根据苹果公司发布的官方信息,Swift比Objective-C快2.6倍,并且随着每种新语言版本的增加,这一数字也在增长。 对于面向客户的应用程序,即使速度差异很小,也可能是决定产品成功与否的关键因素。 如果您的产品需要处理繁重的计算或具有复杂的业务逻辑,那么速度和性能就变得更加重要。 这就是Swift成为构建快速高效的面向消费者的应用程序的首选技术的原因。 另请阅读:在雇用应用程序开发人员之前要询问的10个问题 2.提高团队生产力和幸福感 Swift代码真的很接近自然英语。 简洁明了,这对开发人员的生产力产生了积极的影响。 作为Apple开发人员工具生态系统的一部分,Swift提供了所有必要的现成工具。 除了良好的旧XCode外,Swift还为开发人员提供了绝佳的机会,即可以通过使用Swift Playgrounds即时查看运行中的代码。 所有这些方面使Swift开发变得快速高效。 反过来,这意味着可以为您节省更多的时间和金钱。 此外,根据Stack Overflow Developer的调查,Swift连续第二年仍是最受欢迎的编程语言之一。 开发人员对语言完全钦佩,这一事实极大地促进了开发人员的动力和生产力。 另请阅读:创建应用程序需要多长时间 3.建立时考虑到安全性 使用Swift,您的开发人员可以使用高级错误处理来避免在Objective-C中发生的大多数典型错误。 在Objective-C中,某些缺陷可能不会引起注意,并且以后可能导致无法预测的系统行为。 减少了反馈循环,因为Swift代码中的错误可以通过编译器错误看到,并且可以立即得到解决。 结果是减少了生产中的崩溃和错误,从而大大减少了开发测试阶段所花费的时间和金钱。 4.您的应用程序将面向未来 正如Lyft的首席工程师Martin Conte Mac Donell所说:“使用现代工具为Apple已经计划的一切打开了大门-新平台,新设备。” 实际上,Swift提供了开箱即用的工具和资源,可为Apple生态系统中的每个设备(从Apple Watch到Apple TV)构建应用程序,这意味着100%的兼容性,使您可以充分利用硬件的潜力局限性。 […]
抽象工厂模式提供了一种封装一组具有共同主题的单个工厂而无需指定其具体类的方法。 让我们来看一个例子,众所周知,轿车系列有不同的型号,例如紧凑型,中型和全尺寸。 SUV也具有相同的类别。 假设我们有两个工厂。 一种专注于紧凑型 ,另一种专注于全尺寸。 让我们开始实现这种情况。 这是不同尺寸的轿车和越野车。 它们都符合各自的抽象接口。 如您在下面看到的,我们创建了一个轿车抽象接口(协议),该接口被三种不同的类所采用。 谢谢 !!!
故事板可能很难在团队中处理,因为使用同一文件的多个成员可能会产生冲突。 知道如何创建没有情节提要的iOS项目很方便,但是可以使用IB的功能从XIB文件创建视图。 在本文(以及一些相关文章)中,我将展示: 如何在没有情节提要的情况下启动时创建初始ViewController 如何从XIB文件实例化视图 如何将全尺寸视图附加到初始ViewController 如何在没有情节提要的情况下启动时创建初始ViewController 通过Xcode创建一个Simple View Application,然后从项目中删除情节提要。 修改项目的Info.plist。 “主故事板文件基本名称”默认为“主”,因此请将其修改为空白值。 如果此值保持“ Main”,我们的项目将在启动时搜索Main.storyboard(已删除) 如下修改AppDelegate.swift。 UIWindow(frame:UIScreen.main.bounds)创建一个UIWindow对象,其大小与iOS设备的屏幕(UIScreen)相同 UIWindow对象需要rootViewController。 如下文档所述,如果未分配rootViewController,则不会显示任何内容。 根视图控制器提供窗口的内容视图。 将视图控制器分配给此属性(通过编程或使用Interface Builder)将视图控制器的视图安装为窗口的内容视图。 makeKeyAndVisible()告诉窗口在前端显示。 请注意,也可以通过 self.window?.isHidden = true。 但是,每个应用程序都需要一个关键窗口,并且文档中指出: 尽管触摸事件被传递到发生它们的窗口,但是没有相关坐标值的事件被传递到按键窗口 。 因此,我总是倾向于在主窗口中使用makeKeyAndVisible()。 而已! 现在我们可以不使用Storyboard而启动应用程序,并将ViewController附加到窗口根目录。 但是当前的ViewController缺少视图,因此未显示任何内容。 相关文章 我将在另一篇文章中解释步骤2和3,只是一篇文章不会太长,而我的标题实际上描述了所写的内容。 如何在启动时创建没有Storyboard的初始ViewController(我刚刚解释了😀) 如何从XIB文件实例化视图 如何将全尺寸视图附加到初始ViewController
在开发iOS应用时,我们应该为这些方法编写单元测试。 编写单元测试可确保所需功能正常运行。 因此,让我们开始如何实现它。 在本次会议中,我将Alamofire用于网络请求,将SwiftyJson用于数据解析。 我已经使用CocoaPods安装了这些库。 您可以参考以下链接https://stackoverflow.com/questions/36084956/integarte-install-cocoapods-to-existing-xcode-project-objective-c-or-swift进行CocoaPods安装。 因此,使用Alamofire进行网络调用的代码将是,我已将此代码添加到名为HttpClient.swift的类中 Alamofire.request(apiURL,方法:方法,参数:参数,编码:编码,标头:customHeader) .responseJSON { debugPrint(“ \ n \ napi响应>>> \(String(描述:response.result.value))\ n”) 切换 (response.result){ 案例 .success( _ ): 如果 让数据= response.result.value { 让 json = JSON(数据) completeHandler(json, nil ) 自我 .handleSessionExpiredForResponse(json:json) } 情况 .failure( _ ): 如果 response.result.error!= 无 { debugPrint(“ \ n \ nresponse.result.error!>>> \(response.result.error!)\ n”) completeHandler( nil ,response.result.error […]
每天,都已经很习惯地把大家看到观光游览的叮叮车 认为我自己的批评了 总是一早叮着叮着地到市区 再步行到Moscone Center 就这样,进入了第三天 — — — — 整周的议程,除了课程之外 还有一个你可以直接跟苹果员工接触的管道—“ Labs” 实验室几乎涵盖了所有面向,有— 图形,游戏,媒体实验室 开发人员工具实验室 框架实验室 用户界面设计实验室 App Store实验室 这些实验室是每天都有的 也就是说,苹果员工每天都会出现在这些实验室 所以,强烈建议来WWDC,一定要去跟他们聊聊 或者更棒的是,有问题就可以直接当场问他们 (这样就不用担心饱受每次打去客服转来转去之苦,或技术问题根本很难问到?) 所有实验室中,最夯的就是—“用户界面设计实验室” 因为大家都知道,苹果最有价值的就是设计 所以大家都很想要更深入的了解他们强大的设计师到底在想些什么 而且这么多的Labs,除了有些需要小排队之外 最傲张的就是Design Lab —“还需要事先安排预约!” 因此可以看到很多人一早就来排队,为得就是要能够与他们的设计师聊聊 (还有提供隔间的小房间,可见他们对设计之认可) 而因为我有缘认识的好朋友— Johnny有事先安排好的约会 所以我也真的很有幸地能跟着他一同进去探个究竟 主要过程是Johnny拿出他们他们公司所做的APP给设计师玩玩 接着设计师就会很直接的跟你说 他对于无论是介面或是体验上的主观感觉 然后会当下给些意见,并用纸笔画出来他所分解的想像 过程中,你也可以与他讨论关于这设计上的思维和想法 彼此互相交流,收获满满,真的是个很棒的经验! (但可惜的是,一次只能咨询一个APP) 所以记得,下次去WWDC一定要先去预约用户界面设计实验室! — — — — 除了有幸去Design Lab瞧瞧之外,我还去了—开发人员实验室 为什么呢?因为有一个问题真的陷阱我很久了 直到现在我还是无解 那么我就先简单的前情提要一下好了 — […]