Tag: 编程

Swift中的依赖注入— iOS

在Twitter上关注我: @ kiranjasvanee 依赖项注入对于一个简单的概念来说是个大词,该概念是允许对象接收其所需的依赖项。 让我们先用一个不好的例子来说明这一点,然后再使用依赖注入来查看使用它可以获得的所有好处,改进和安全性。 假设您正在构建一个用于创建专辑并在其中添加歌曲的应用程序。 首先创建相册模型。 类相册{ private var albumName:字符串! func getAlbumName()->字符串{ 返回专辑名称 } } 让我们尝试在您的ViewController之一中获取albumName 类ViewController:UIViewController { 覆盖func viewDidLoad(){ super.viewDidLoad() 让albumInstance = Album() print(“相册名称:\(albumInstance.getAlbumName())”) } } 现在,您在这里崩溃了您的应用程序。 您正在尝试使用getAlbumName()来获取albumName ,但albumName设置albumName 。 在这里, albumName是您必须注入的依赖项,当然,没有专辑名称时,您将如何发行或添加歌曲。 让我们通过注入依赖关系来解决此问题。 类相册{ private var albumName:字符串! init(albumName:String){ self.albumName = albumName } func getAlbumName()->字符串{ 返回专辑名称 } } 现在,使用我们的新init函数设置albumName的值。 let albumInstance = Album(albumName:“信誉”) print(“相册名称:\(albumInstance.getAlbumName())”) […]

项目及其对理解概念的好处。

因此,我进入iOS程序至少有四个月了,做实验,尝试通过测试,等等。我记得回想起来,而我想做的只是通过实验,他们会为我们提供服务,即使实际上没有最后期限,也要快速前进。 我在执行此程序时一直在做的问题是,我没有掌握这些实验室的主题概念,而只是试图让它们通过。 我的实验室会通过,但真的在我的脑海中,我不明白他们为什么会通过,或者我真正做了什么。 一旦我进入了一个项目,而这个项目几乎完全由您自己决定,我意识到是的,实验室是有价值的,但是随着项目变得越来越复杂,您也会学得更多。 我小组研究的项目是星座应用程序,您可以根据从我们发现的API输入的生日来获取每日星座运势。 我意识到,我们的项目需要iOS程序教给我们的许多重要内容,最终将它们整合在一起以创建我们的App。 我们的星座应用程序包含程序约束,核心数据,动画,API调用,堆栈视图,可可豆荚等。 当我做这些单独的实验室时,我从来没有想过自己会像我们正在学习的所有这些主题如何被整合到一起。 我不仅自学了应用程序所需的内容,而且还理解了为什么我们需要在程序中学习这些内容以及它们之间如何相互联系。 当我们小组正在处理我们的项目时,我们会互相大声说:“ 嘿,我们需要合并Core Data来保存用户的生日 ”和“ 我们还需要将此特定的API调用放入NSOperation.mainqueue中 ” ,我认为这很棒,因为我终于了解了与我们学习的所有主题的联系。 我还意识到,您可以找到自己的编码样式,而不是遵循实验室的指示并尝试编写编码来满足测试要求。 在项目模式下,您需要编写大量代码并尝试使其正常运行。 同样在项目中,当您的项目变大时,名称约定非常重要,我记得在做我们的星座应用程序时,我忘记了自己的功能(我在其中创建的功能)做了什么,因为我不好地命名了该特定功能,因此我也来了认识到您的代码不仅必须正确工作,而且不仅对他人而且对您自己也都可以理解您的代码。 起初,我对处于项目模式感到非常怀疑,因为我认为我无法在项目中做出很大的贡献,但是我学会了对我们需要的东西进行研究,这是我非常努力地学习的,并且了解了主题并了解了它们。 我为我的团队非常优雅,因为我们很棒! =],我们学习了如何共同制作一个应用。 当我们的应用程序最终完成时,我将在下面放置链接。 编辑:9/28/2015 —占星术终于在App Store中了!!!! https://itunes.apple.com/us/app/id1146310854

如何在iOS中实现可折叠表部分

🎉终于发布了CocoaPod! 看这里。 这是一个简单的iOS项目,演示了如何以编程方式实现可折叠表格部分,即没有主故事板,没有XIB,无需注册笔尖,仅是Swift 3! 在此项目中,表格视图会自动调整行的高度以适合每个单元格中的内容,并且自定义单元格也以编程方式实现。 可以在我的Github上找到源代码。 如何实现可折叠表格部分? 步骤1.准备数据 假设我们将以下数据分为不同的部分,每个部分都是一个Section对象: crashed表示当前节是否折叠,默认为false 。 步骤2.设置TableView以支持自动调整大小 步骤3.节标题 根据Apple API参考,我们应该使用UITableViewHeaderFooterView 。 让我们对其进行子类化并实现节头CollapsibleTableViewHeader : 当用户点击标题时,我们需要折叠或展开该部分,为此,我们借用UITapGestureRecognizer 。 另外,我们需要将此事件委托给表视图以更新折叠的属性。 由于我们没有使用任何情节提要或XIB,如何以编程方式自动布局? 答案是NSLayoutConstraint的ConstraintsWithVisualFormat函数。 步骤4. UITableView数据源和委托 段数为sections.count : 并且每个部分中的行数为: 注意,我们不需要为折叠部分渲染任何单元格,如果该部分中有很多单元格,则可以大大提高性能。 接下来,我们使用tableView的viewForHeaderInSection函数来连接我们的自定义标头: 普通的行单元格非常简单: 在上面的代码中,我们使用普通的UITableViewCell ,如果您想了解如何制作自动调整大小的单元格,请查看源代码中的CollapsibleTableViewCell 。 CollapsibleTableViewCell是UITableViewCell的子类,它添加了名称和详细信息标签,最重要的是它支持自动调整大小功能,关键是正确设置自动布局约束,确保将子视图适当地拉伸到顶部和底部。 contentView 。 步骤5。如何切换折叠和展开 这个想法真的很简单,如果某节的折叠属性为true ,则将该节内的行的高度设置为0 ,否则设置UITableViewAutomaticDimension ! 这是切换功能: 重新加载这些节后,将重新计算和重画该节中的单元格数。 就是这样,我们已经实现了可折叠表格部分! 请参考源代码并查看详细的实现。 执照 该项目已获得MIT许可,版权所有©2017 Yong Su。 作者: Yong Su @ Box […]

成为iOS开发“风行一时”的我的旅程。

大家好,如果您像我一样,那么您对编码世界还是一个新手。 对于那些不是那么新的人,也许这个故事会激起一些怀旧的回忆。 C4Q徽标。 去年九月(2017),我在名为Queens for Queens的组织中启动了访问代码研究金,该组织也被学生称为C4Q,现在称为Pursuit。 在那之前,我刚大学毕业,并不真正知道我的职业方向。 我从哥哥那里听说过C4Q,因此决定看看。 从表面上看,他们的任务看起来非常好并且令人鼓舞,所以我决定签约并试一试。 我经历了一个非常严格的过程,其中包括现场技术和行为面试,以及最终以“最终考试”结束的javascript讲习班,以了解我们如何很好地掌握代码。 我不会撒谎,有一段时间我非常担心自己不会加入。不是因为我不认为自己可以削减它,而是因为我真的很想进入程序。 每天,我都会焦急地检查我的电子邮件是否有响应,在经历了数次令人烦恼的神经困扰之后,我终于收到了他们的回复。 我已经被他们的iOS开发程序接受了!!! 对我来说,这是一个巨大的胜利,但是我知道,这仅仅是漫长道路的开始。 现在,我要说这是我的课程非常幸运,我们有一位很棒的教练,而ta也同样出色。 更不用说我的同龄人了,我们都是一群陌生人,但是很快就变成了一个紧密联系,非常支持家庭的家庭。 说到家庭,我的兄弟(同行业)在整个过程中都非常支持我。 艰难的爱情和一切,哈哈! 该程序从我们开始学习Swift的基础知识:let,var,字符串,int,数组,作品! 考虑到我从来没有在javascript讲习班之前真正编写过代码,我会承认这令人望而生畏。 每天都有一场学习和理解摆在我面前的代码的战斗。 几周后,我们掌握了有关基础知识的知识并开始了逻辑学,这是我做过的最难的部分之一。 仅仅把头放在如何构建和组织逻辑代码上是很困难的,但与此同时,当我开始工作时,这是非常有意义的。 跳过几周,我们即将从Swift操场毕业到实际的XCode项目! 就是这样,我们将初体验情节提要和制作应用程序,尽管相当简单,但仍然需要应用程序。 我非常激动和焦虑,但是我走了这么远,我现在并不想停下来。 我毫不犹豫地投入工作,并通过所有的成功和失败来拥抱这个过程,并相信我有很多失败。 学习成为开发人员的一部分是学习如何处理挫折和失败。 每一次挫折和失败都是一个学习的机会,如果您不学会以这种方式看待它们,学习将不可避免,并且总是会成为艰巨的战斗。 再快一点,我们的团队又选了一位超级才华的教练。 大约是在这个时候,我开始与同学一起进行小组项目。 让我告诉你,如果您认为自己学习编码和编码很困难,那么与一组开发人员一起工作是一种新的挑战,充满挑战并能自给自足。 我必须非常快速地学习如何谦逊自己,而不是占有我编写的代码。 我的一位讲师说的一句话会永远陪着我:“当您在一个小组中工作并向小组贡献代码时,代码属于该小组,这就是与小组一起工作的意义”。 我最终做到了C4Q的简称“ hackathon”。 我们都提出了应用创意,人们投票支持他们想要开发的应用。 这个过程历时3天,我们的团队不得不从头开始构建一个完整的原始应用程序。 如果我认为在常规的分配小组项目上工作很辛苦,那将是一大挑战。 直到那时,我还没有意识到我的git技能真正需要多少工作。 至少可以说,我还和一个团队一起工作,该团队功能异常严重,但最终我们都做到了。 在黑客马拉松结束时,我们所有人都将应用程序演示给了来自实际开发人员世界的评审团。 这是我第一次真正的兴趣,是在公开场合与同学以外的其他人谈论我们开发的应用程序,它的功能以及回答更有经验的开发人员的棘手问题。 阶段应用徽标。 现在,让我们跳过大约一周左右的时间,终于到了我们的顶点项目的时候了。 黑客马拉松的概念几乎相同,只是规模更大。 我们能够选择理想中的合作对象,而现在我们都对与谁合作的对象有了很好的了解,我很幸运地加入了一个没有很多自负的团队它。 作为一个小组,我们讨论了一些应用程序的想法和名称,直到我们都同意应用程序“阶段”(此处显示徽标)。 Phase是一个社交应用程序,可让用户创建称为“旅程”的相册,每个帖子均称为“阶段”。 它从头到尾着重于各个旅程的整个过程。 此外,除非他们想关注所有内容,并且与其他竞争对手相比,它可以使用户更好地组织图像内容,否则用户也不会被迫在其供稿中查看某人的所有内容。 四周后,在其中将近140个文件和将近70,000行代码的情况下,我们将在这里的PayPal / Venmo总部在更大的评委和更大的人群(超过100人)面前展示我们的应用程序在曼哈顿! 谈论一个很高的要求。 […]

让我们建立App Store的互动过渡

新设计的App Store具有许多闪亮的新功能,但是没有什么可以与Apple在选项卡栏中添加的“今日”部分相提并论的。 它具有大量用户可能会感兴趣的信息,并添加了“ APP OFF THE DAY”,“ DAY GAME OF DAY”等类别,这是非常明智的举动,它使App Store在新加入的程序员中更具竞争力,由于用户将不再仅看到收视率最高的应用程序。 当我浏览新类别时,我对自己说:哇,这种过渡看起来令人惊讶,并且可以平滑地连接两个不同的页面。 因此,我决定自己制作一个版本。 完整的项目在本教程的最后 重新创建类似Apple为App Store“今日”类别制作的卡片。 通过使用集合视图+平移手势识别器。 该项目基于Swift 4。 只需将TransitionClone.swift复制并粘贴到您的项目中,然后将UIViewControllerTransitioningDelegate添加到要使用的Class中。 然后在上面添加两个函数。 在这里,我创建了一个名为transitionMode的枚举,目的是告诉代码我们处于什么过渡状态,如果要到Present而不是将其设置为“ present”,或者将dismiss设置为“ dismiss”,则很简单。 不要忘记设置开始帧和结束帧,例如: 对于Pan Gesture,我们将使用UIPanGestureRecognizer,其中包括诸如开始,更改,结束等状态。这将为我们提供方便的方式来操纵动画进行中的百分比。 您很快就会得到我正在谈论的内容,但是现在让我们将上面的代码添加到目标视图控制器中即可。 在Image上拖动时创建收缩的动画,请注意,由于UIViewPropertyAnimator具有暂停和恢复动画的优势,因此我们在此处不使用UIView.animate。 您可能在想为什么我们需要暂停和恢复动画? 因为我们希望动画与用户的手指互动! 换句话说就是“跟随”手指。 创建一个手势识别器并添加到UIView中,我在按钮上添加了它,但是可以将其添加到imageView上 创建panRecognizer,它应该可以正常工作。 这就是魔术的作用,在开始播放后立即暂停动画,现在我们以防万一.changed,然后跟踪手指从其初始位置拖动的垂直距离(如果要跟踪水平距离,只需更改平移。 y⇢translation.x)。 而不是将其添加到当前动画过程中(animator.fractionComplete)。 对于单次点击识别,它甚至更容易,无需添加另一个点击识别器。 只需在identifier.state = end中添加一条if语句,请参见下面的代码:) arnoldlee850807 / rebuildAppStoreTransition 通过在GitHub上创建一个帐户来促进rebuildAppStoreTransition开发。 github.com 希望您像我一样学到UIPanGestureRecognizer的惊人之处,祝编码愉快! Freepik从www.flaticon.com制作的图标已获CC 3.0 BY许可

Swift的错误处理

Seringkali,ketika ada error di sebuah aplikasi,ada 2 kemungkinan yang terjadi。 Pertama,崩溃tanpa permisi,lalu yang kedua aplikasi tidak崩溃,dan muncul pemberitahuan ke pengguna bahwa aplikasi sedang bermasalah。 Tentunya,北蒂达克(Kita Tidak Ingin)Kemungkinan Yang Pertama itu Terjadi kan吗? Penyebab Aplikasi撞车 Di dunia iOS开发,penyebab崩溃seringkali disebabkan oleh开发人员yang menulis kode程序yang tidak 安全 ,misalkan 强制转换,强制展开可选值, tidak sengaja membuat 循环依赖项 antar objek yang keduanya sama-sama memiliki […]

エラーメッセージ定义を掘り下げる

ここではSwiftのコンパイルエラーのメッセージ定义を改めて掘り下げる。 defッセージ定义は.defファイルの中でこのような形で书かれている。 错误(extra_rbrace,none, “顶级的外部’}’”,() ERRORの他にWARNING AR NOTEもあるが形は同じである。 そ利用方法に応じて様々な形に変えられる。その変换处理は#define机能を使って非常に复雑に(どこが走っているかわかりにくい状态で)行われる。 .defファイルには,それぞれ対応する.hファイルがあり,まずはそのペアのつながりで.defファイルがどう利用されるかを见ていく。 .defファイルと.hファイルのペアというの例,例えば DiagnosticsParse.def に対して DiagnosticsParse.h があるということ。 .defファイルの中身は #ifndef错误 #定义ERROR(ID,Options,Text,Signature)\ 诊断(错误,ID,选项,文本,签名) #endifそれぞれのメッセージ定义が大量#ifndef DIAG_NO_UNDEF #如果已定义(DIAG) #undef DIAG # 万一 #undef错误 #万一 となっている。ポイントを挙げると ファイルの头で, ERRORがすでに#defineされているかどうかを确认し,されていない场合には#defineを行い, ERRORをDIAGに置き换える设定をする(引数の表记は省略)。 一个々のメッセージ定义の后,最后にDIAG_NO_UNDEFの状态によりdefine状态の消去を行う。 ちなみに, WARNINGとNOTEが构造がERRORと同じなので省いてある,ここから先も同じ。 h .hファイルの中身は #include“ swift / AST / DiagnosticsCommon.h”#定义DIAG(KIND,ID,Options,Text,Signature)\ 外部详细信息:: DiagWithArguments ::类型ID; #include“ DiagnosticsParse.def” DIAGが#defineされて, extern detail::DiagWithArguments::type ID; になる。 defの后で.defファイルが#includeされる。 h,この.hファイルを読み込んだ场合は, ERROR […]

Swift中的新手课程

在上一篇文章中,我谈到了结构,因此我只认为对Classs进行跟进是正确的。 将Classes制造商用来生产产品的模具。 您可以基于一个模具来创建许多产品。 使用一个模具( class ),您可以基于每个模具具有的形状,大小等属性( properties )来创建多个产品( objects )。 让我们看一下代码 打开操场跟进。 这是class的基本语法。 如果您熟悉结构,您会注意到类似的类语法。 假设我们有一个简单的Person class示例。 在该类中,我们将具有name和age的properties ,然后将其赋予一个initializer 。 initializer是我们每次尝试创建Person object时都会运行的方法。 在初始化程序中,我们传递组成Person的参数。 我们简单地创建一个名为person1的变量,该变量等于Person class ,当添加括号时,它将询问我们在初始化器中声明的参数。 现在我们可以使用person1对象并获取其属性。 类中的功能 我们还可以在类中使用函数,这将使我们的人员对象具有调用能力。 使用getName()我们返回一个String说“您的名字是_____” 我们可以通过person1对象访问函数。 类是引用类型 类是引用类型,而结构是值类型。 我将演示引用类型如何工作。 如果您想了解结构和值类型,请转到我的前一篇文章。 如果要创建一个新对象, person2如下所示: 然后创建一个变量person3 等于 person2 : 然后我们更改person3的属性,让我们看看它将如何更改person2。 让我们给person3 55岁 。 现在,让我们同时阅读person2和person3的年龄。 您可以看到两个年龄都相同。 为什么? 这是因为person3本质上是person2。 当我们存储一个类时,我们会将这些信息存储在内存中,并且person2持有对该数据所在位置的引用。 当使person3等于person2时,我们只需查看该数据的相同参考位置。 Person3不是person2的副本。 是人2。 希望有道理。 包起来 这是有关类的非常准系统的文章,我计划在另一篇文章中也涉及类的继承。 […]

我的代码检查清单

(由我们自己的Mobster Sameh Mabrouk ,高级iOS开发人员 @Mobiquity贡献 ) 代码审查的定义: 根据维基百科: 代码审查是计算机源代码的系统检查(有时称为同行审查)。 它旨在发现在初始开发阶段被忽略的错误,从而提高软件的整体质量。 好吧,我想这样做! 等等,但是…… 怎么做? 可以采用多种形式进行审核,例如配对编程,非正式演练和正式检查。 最有名的大概就是这个-给我看看您的代码(又名非正式评论)! 只需让您的同伴查看您的代码即可。 可以使用不同的工具(例如Atlassian的Crucible / Fisheye或BitBucket / GitHub上的拉取请求)或任何您使用的工具来执行正式代码审查。 借助这些工具,您可以很好地看到对源代码所做的更改,可以对它们进行注释,向作者提出一些问题,然后他们可以解释其代码。 就像您在现实生活中进行的对话一样,但是要记录在案–同意的内容应该在合并成开发之前执行。 等待,什么合并? 我们只是在谈论评论… Git流 在工作中开发应用程序的不同部分时,我们使用Git和Git Flow将所有更改合并到父分支中。 应用功能完成后,我们将创建一个请求请求,其中包含要添加到先前分支(通常是开发 )中的更改。 我认为,显示流程的最佳图片来自GitHub。 流程如下所示: 从开发创建分支 将您的更改应用于源代码 创建一个合并到例如开发中的拉取请求 与同事讨论变更,解释您的观点并应用建议的改进措施 您的同伴批准您的更改 将您的代码合并到源分支 进行审核时应该注意什么? 您绝对应该检查代码的完整性-样式是否与以前的解决方案匹配,是否遵循约定的约定? 功能是否正确实现(关于这一点,我会建议PR创建者是否可以添加.GIF图像来说明功能的工作原理,这样很好) ,更改后旧的源代码是否可以正常工作? 为什么要在开发过程中关心代码审查? 可以肯定的是,由于它确保代码完整性(),因此可以捕捉到其他人看不到的东西。 它可以让您学习和分享您的知识和专长,通过与您共同的话题(代码和编程技能;)的对话,加强团队中的沟通并建立良好的关系;)! 就我个人而言,最近在我当前的项目中已经看到了。 团队在沟通方面存在问题,但是在我们进行了代码审查的对话之后,沟通变得更好了。 将代码审查视为对未来的投资。 如果您现在不捕获错误,那么将来一定要征服它们。 如果您不执行代码审查该怎么办 想象一家X公司,它为多个客户提供移动应用解决方案。 他们的团队很小,有时甚至无法满足客户的需求。 因此,他们决定将一些工作外包给外部公司。 他们向该公司提出项目要求,并在3个月后再次开会以接收应用程序源代码。 但是该应用程序无用,它在网络调用时冻结, […]

学习Swift和iOS开发第5部分:数组

数组是有序集合类型。 它存储多种类型的数据集合并按数字顺序排序。 我们在第3章中学到的变量非常适合存储单个值。 在现实世界中,我们经常需要跟踪属于同一类别的多个数据。 例如,员工薪水,我们收藏中每本漫画书的价值或商店库存中每件商品的成本。 为上述每个项目创建一个单独的变量很费时,而且老实说这不是一个好代码。 这就是数组的来源。*提示胜利的音乐*! 数组是一个有序的集合,允许我们存储多个值。 在本章中,我们将看到它们的实用性。 搭建游乐场 首先,如果尚未打开Xcode,请点击Create New Playground 。 命名为“ Arrays”,然后单击“ Next 。 选择某个位置以保存此.playground文件,然后单击“ Create以保存它。 您应该会看到类似下面的屏幕。 删除左侧的所有样板代码,但根据需要保留import UIKit 。 创建你的第一个数组 让我们使用以上示例之一:收藏集中每本漫画书的价值。 🤓想象一下,您有一个收藏集,尽管很小,但其中包含5本漫画书。 它们各自具有不同的值。 我们可以为每本漫画书创建一个变量,并像这样存储值: var comicBook1 = 10.0 var comicBook2 = 27.50 var comicBook3 = 1015.0 var comicBook4 = 55.0 var comicBook5 = 2.0 如果有人偷了您的一本漫画书怎么办? 如果您卖了一个怎么办? 您将需要手动删除该行代码,然后重新编号其后的变量,因为每个变量都有特定的编号和顺序。 相反,我们可以创建一个名为comicBooks的数组,并将值放在其中,如下所示: var comicBookValues […]