Tag: 软件开发

视图控制器之间的自定义过渡

通过场景之间的动画和/或交互式过渡来制作引人入胜的精美UX。 当视图控制器过渡到另一个视图控制器时, 实际的过渡操作以通过UIViewControllerContextTransitioning类型的对象访问的过渡上下文的形式在容器视图中进行 ,您可以在其中访问过渡器的两个视图(“ fromView”)和过渡对象(“ toView”)。 我们将看到如何在视图控制器之间建立动画过渡,并且默认情况下将它们准备好是交互式的,因为如果需要, UIPropertyViewAnimator允许我们与旧的API相当平稳地执行此操作。 更好地了解如何实现“完整的事情”,并且如果需要的话,可以使过渡成为非交互式的要好得多。 别偷懒,开销只是几行代码。

设计自定义数据结构的过程

在开发应用程序时,我们可能会遇到这样的情况,即我们无法使用的数据结构真正适合我们要完成的任务。 最近,我遇到了这种情况,正在开发一项功能,该功能要求使用事件监听器的集合。 今天,我想我会借此机会分享设计自定义数据结构背后的思考过程,并提出一些在实现它之前可能要回答的问题。 步骤1:要求 每个设计过程的第一步都是实际确定您希望新结构能够完成的工作。 这包括写下绝对必须要做的事情,以及在哪些方面我们可以摆脱“次优”表现。 让我们针对我们的侦听器列表进行此操作。 在我们的列表有效期内,听众可能会分配,也可能不会分配。 我们不希望我们的列表成为对象保留在内存中的原因(并有可能以意想不到的方式操纵我们的程序),因此我们将需要一些保持弱引用的对象。 由于侦听器对象可能已释放,因此我们需要一种清除这些对象的方法。 清理结构最多需要O (n)时间,并且应该可以将清理作为其他操作的一部分进行。 使用侦听器列表时,将对象插入列表比删除对象更常见。 因此,插入将需要尽可能快,但是移除将不是关键。 我们将采用O (1)的插入复杂度和最多O (n)的移除复杂度。 通知列表中的听众将是我们列表中的重要任务。 由于我们需要通知列表中的每个侦听器,因此O (n)是我们可以避免的最快的复杂性。 在满足所有要求之后,我们可以开始考虑使用什么基础数据结构。 步骤2:设计 查看标准库中的可用内容,我们遇到了NSPointerArray —一个可以保存指向对象的弱指针的数组。 这满足了我们的第一个要求。 实际上,此数组几乎可以满足我们上面印刷的所有要求。 唯一不满足的要求是第二个要求。 当我们在其上调用.compact()方法时,有很多nil指针的情况下,运行时复杂度(基于实现细节的假设)最终将是二次方的,这不是我们想要的。 如果我们考虑自己设计自定义数据结构怎么办? 什么是合适的? 让我们看一下链接列表。 链接列表满足第一个要求,因为我们可以设计节点以保留对其对象的弱引用。 通过将新节点添加到列表的根端,我们可以在恒定时间内插入新对象。 删除对象将是O (n)操作,因为我们需要遍历列表并查找引用。 这是可以接受的,因为这是我们在要求中指定的内容。 通知我们的侦听器对象就像遍历列表一样简单,这是一个O (n)操作。 另外,我们可以使用相同的遍历查找零引用并将其删除。 如果我们在通知周期的一部分中实现删除,那么这将与重新分配一些节点指针一样容易,并且将是O (1)操作。 考虑一下,这种结构实际上听起来很适合我们的目的。 步骤3:实施 我们将花费一些时间来查看自定义结构的一些实现细节。 首先,让我们看一下链接列表的“协议”(严格来说,这只是出于说明的目的,因为为这样一个特定的实现制定协议实际上没有任何意义,并且其中包含了我们不会通常要公开)。 这些方法将是非常基本的,并且我敢肯定您自己实现这些方法不会遇到任何问题,但是我将花几行.notify()讨论一种很好的方法,以将一种清除列表的方法合并到.notify()方法。 协议WeakReferenceLinkedList { relatedtype数据类型:AnyObject var root:WeakRefNode ? func insert(_ object:DataType)->无效 […]

Swift:没有人会打扰的常见错误-一流的功能和保持循环

您好,我亲爱的开发人员, 最近,我认识的一家基于洛杉矶的创业公司联系我,要求我进行代码评估。 他们在代码不稳定,随机崩溃和类似问题上遇到了可怕的问题。 我能说什么 代码中充满了我在上一篇文章中提到的错误(尤其是强制拆包和强制转换,我向之致敬,因为它们是导致大量崩溃的原因)。 但是,由于人们了解Swift中的所有功能都是一等的高阶函数,因此在不同的项目中一遍又一遍地出现了一个特别的错误。 您可以放入变量,将其作为参数发送给其他函数,并作为执行某些函数的结果来接收。 因此,让我们看一下一般的简化情况: 免责声明 : 这是概述方法的示例代码,其他代码段也是如此。 请原谅我,我的读者,我的确理解这一点。 令我震惊的是,有多少人没有得到我所有的文章都描述了通用方法,而不是具体用例。 处理器是执行处理并在处理完成后调用回调的某种实体。 在这种情况下, 数据是拥有处理器并对处理完成时调用的回调感兴趣的某个实体。 最简单的用户故事之一是Data是UIViewController子类,而Processor是UIView子类,当用户以某种方式与视图交互时,该类从控制器调用回调。 那么,这段代码有什么问题呢? 我们这里有一个保留循环。 Data和Processor都不会被释放。 检查我的陈述确实是真的很简单。 只需将调试打印放入Processor和Data的 deinit方法中即可。 如您所见,它从未打印任何内容,因为从未调用过deinit 。 那是因为保留循环。 但是为什么在这种情况下实际上会出现保留循环? 为了掌握这一点,您需要了解swift中的任何struct和class实例函数都是闭包。 闭包是捕获和存储外部上下文(例如变量)的一种函数。 一个完美的关闭示例是: autoincrementedIDGenerator返回一个函数,该函数捕获id并对其进行操作。 每次我们调用该函数时,它都会创建一个名为id的新变量,并返回捕获该变量的函数。 当我们测试输出时,我们将收到: user id = 0 user id = 1 user id = 2 image id = 0 image id = 1 image id […]

2019年学习iOS开发的5个最佳Udemy课程

今天,我想分享Udemy上排名前五的iOS开发课程。 这是我亲自上过的课程的精选清单,或者是 我的YouTube频道 社区里的伟人 所推荐的课程。 对于刚开始进行iOS开发的人员,我相信您会在此列表中找到适合您需要的内容,只要您投入工作,它将使您成为一位知识渊博的iOS开发人员。 披露:透明度对我很重要,因此我必须告诉大家所有该帖子包含会员链接。 请记住,这些只是基于我们经验的意见,可能不是您的最佳课程或指导。 可以在这里找到Udemy网站! 单击相应的标题直接进入课程。 1. iOS 12和Swift-完整的iOS应用程序开发训练营 我将学到什么? 能够构建您想要的任何应用程序 开创自己的基于应用的业务 通过担任自由iOS开发人员成为数字游牧民 掌握如何使用Apple的新ARKit2创建增强现实应用程序 标价: 200美元 授课教师:俞安琪 社会证明: 7,590条点评,4.7星,34,252名学生 样本审查: “本课程有很多实践练习,有助于确保我们理解所解释的概念。 解释非常好,并且与许多其他程序不同,我不觉得自己像在Angela所展示的XCode上那样简单地工作,而是要自己学习和试验。 我真的向愿意学习iOS开发的任何初学者推荐该课程!” 2.针对初学者的iOS 12和Swift 4.2:200多个动手教程 我将学到什么? 掌握从初学者到专家的iOS 12和Swift 4.2开发。 从头开始创建真实世界的应用程序并将其发布在App Store上。 设计外观精美且令用户满意的应用程序。 构建与Web服务通信并在线存储其数据的应用程序。 标价: 200美元 授课老师: Ray Wenderlich 社交证明: 125个评分,4.6星级,926名学生 样本评论: “ Ray Wenderlich的另一个很棒的课程。 我研究他的教程已有多年了。 他有一些很棒的课程和书籍,可以教您编程的来龙去脉以及成为一名出色的开发人员。 令人高兴的是,他如何分解所有内容,还给您带来一点挑战,可以完成工作,并降低专业开发人员的思考过程。 A ++类。 Def工作选择了Ray的任何课程,这是另一个很棒的课程。 […]

今天,我开始了我的博客。 但为什么?

在本博客中,我将主要撰写有关软件开发,Swift,iOS,机器学习,算法和到目前为止我学到的其他有趣主题的文章。 没有世界,就不可能有程序员的博客! 因此,您在这里: let hello = “Hello World” 当然在Swift😉 但是,为什么要创建一个新博客? 博客还不够吗? 几个原因😉 我想在2016年创建此博客。实际上我当时写了两篇文章,但从未发表过。 帖子差不多完成了,博客也差不多完成了。 我只是还有其他更紧急的项目需要处理。 至少那是我对自己说的。 因此,第一课是: finish what you have started 。 无论如何,只需完成即可。 我已经遵循这种模式已有一段时间了。 第二个原因更为重要- learning while blogging 。 当您想向他人解释刚刚学到的东西时,这是完全不同的事情。 突然,您意识到您不确定事物在幕后的实际运作方式。 为了撰写有关它的博客文章,您需要更深入地研究,阅读文档并收集更多信息。 这都是关于学习的。 第三个原因- connecting with others 。 博客使您与人更近。 您会惊讶于其他人如何解决您面临的问题。 把自己放在那里,让别人看看你怎么说。 原因四: give back to the community 。 多年来,我一直在使用开放源代码库,并向其他博客学习。 现在该做出贡献了。 让其他人向您学习。 交流思想,分享知识。 最后但并非最不重要的writing is […]

Swift中的三元条件运算符:有什么用?

开发人员熟悉三元运算符(或更确切地说是三元条件运算符)。 它不是特定于Swift的,而是许多编程语言中的基本运算符。 如何在Swift中使用它? 对于许多开发人员来说,“是这样还是那样?”,只要代码仍然可以编译并完成工作,这只是喜好和习惯的问题。 对我来说,这是一个有趣的问题,值得寻找答案。 首先,这是Swift.org上Ternary运算符的定义: 三元条件运算符是具有三部分的特殊运算符,其形式为question ? answer1 : answer2 question ? answer1 : answer2 。 这是根据question是对还是错来评估两个表达式之一的捷径。 如果question为真,它将评估answer1并返回其值; 否则,它评估answer2并返回其值。 三元运算符通过减少1个缩进级别来帮助使代码变平,因此有助于嵌套if -s来解决著名的厄运金字塔 。 例如,此代码 让持续时间:TimeIntervalif进度<0.2 { 持续时间= 1.0 }其他{ 持续时间= 2.0 } 可以通过使用此?:模式来以一种优雅的方式缩短 让持续时间:TimeInterval =进度<0.2? 1.0:2.0 整齐! 就个人而言,我喜欢在代码中使用此运算符。 每当需要分支时,我都想知道是否要使用三元运算符来实现。 但是,在某些情况下,我还是更喜欢 或switch 。 情况#1:当代码可读性受到损害时 三元运算符通常使代码更紧凑,但不应将其链接或嵌套。 我同意这样做时可以减少代码行,但那样可能会伤到你的眼睛(和其他人)🙂 假设我有一个名为BatteryLevel的枚举: 枚举BatteryLevel { 大小写无效 小写 案例中 情况高 } 现在,我要在其中添加一个初始化程序init(percentage: Int) […]

Swift内存布局简介

在上一篇文章中,我们讨论了Swifts 值类型语义的一些功能。 今天,我们将看一下如何分配不同的Swift类型以及这对我们的应用程序性能意味着什么的基础知识。 一个简单的类是Reference Type ,就像上一篇文章中提到的那样。 它具有一些我们大多数人都很早就了解的功能。 例如,单个类对象可以被多个变量引用和操纵。 但是,当我们创建一个类的实例时会发生什么呢? 类MyClass { var a:整数 init(a:Int){ self.a = a } } var A = MyClass(a:1) 上面的示例提供了一个简单的类,使我们可以开始研究创建引用类类型的变量A时发生的情况。 当我们调用MyClass初始化程序时,将进行一次调用以分配足够的内存以将我们的对象存储在内存中,在这里我们需要查看主内存的两个非常重要部分的第一个,即The Heap 。 堆是我们内存中用于动态分配的一部分。 这意味着如果在运行应用程序时需要即时创建一个新的引用类型对象,则需要在The Heap上请求空间。 由于内存的这一部分需要能够一次为多个线程提供服务而又不破坏任何数据,因此还需要一些机制来避免两次分配相同的内存块并处理并行分配调用。 在不详细介绍如何进行管理的情况下,让我们继续进行以下假设,即这实际上需要花费一些时间。 一旦找到足够的内存块并为我们分配了内存,我们的应用程序即可完成对对象的初始化。 除了初始化类中的实际值外,还需要初始化一些元数据值(其中包括类型数据和引用计数器)。 Swift使用一种称为自动引用计数(ARC)的方法来跟踪实际使用的对象。 如果某个对象未被任何变量引用,则可以安全地将其删除,并且可以将存储块返回以用于其他用途。 这是一个很棒的功能,但是它伴随着每次创建或共享对象时更新计数器的开销。 通常,如果您只是分配一个新对象,那么花费的时间就不会引起您的注意。 但是,如果您的程序不断创建这样的新对象,那么成本将会增加,并且您最终可能会浪费本来可以更好地用于其他用途的资源。 正如我在上一篇文章中提到的那样, struct和enum (以及其他)都是Value Types 。 我们需要问自己的问题是:将在哪里分配值类型? 这部分会有些棘手。 让我们首先看一下堆栈 -两个重要的主内存部分中的第二个。 堆栈是内存的一部分,它从其操作方式中获得名称-就像堆栈一样。 这个想法是,您有一堆数据,如果您添加任何新数据,它将被添加到顶部。 删除数据也被限制在内存空间的顶端,因此我们只能删除当前放置在顶部的数据。 系统使用一个简单的指针来跟踪当前堆栈内存顶部的位置。 这意味着分配和取消分配内存是通过简单的增量或减量操作完成的,因此非常快。 不利的一面是,这种结构与The Heap可以提供的动态分配类型不太兼容。 […]

iOS开发摘要-1

,давнособираюдлясебявсякиеполезныессылки,которыемогутпригодитсявгребле。 Вотподумалось,чегобынеподелитьсясхорошимилюдьми。 Аroot的rootViewController вастовозникаетнеобходимостьзаменитьодинстекконтроллеровнадругой。 Нунапример,онбордингзакончился->начинаемлогинфлоу,посленегопоказываемглавныйэкранприло。 请参见, 导航控制器和setViewControllers。 。такиделалнапрошломпроекте。 Новосссылкенижекамрадпредлагаетальтернативноерешение— rootViewController和UIWindow 。 Простоиэлегантно,дажеобидночточтосамнедодумался) 动画UIWindow的rootViewController过渡–丹尼尔·马古蒂(Daniele Margutti) 有时在应用程序的生命周期中,您可能需要更改主代码; 一个典型的案例也许是…… danielemargutti.com 迅捷游戏Новыефичисловарей Добрыедядьки-разработчикипрекрасногоязыкаSwiftсделалиегоещёлучше,добавивмногоништяковдля 字典 &。 Swift 4.0中的字典和集合改进 在最新版本的Swift中,字典和集合获得了许多新的方法和初始化方法,这些方法和初始化方法变得很普遍…… swift.org Гmap 值 выглядятпростопрекрасно,помоему。 Даиостальноеничего。 Кстати,кандидатуназаметку。 “обязательноспрашиваюнасобеседованиях“чтопоявилосьвновомсвифте”。 Иногдаспрашиваюточечнооконкретныхфичах。 Судяпоответам,вышесодержатсявысшие,сакральныезнанияабсолютнонеизвестныерядовому。 Делаемвыводы。 Пятьминутначтениеитывследующейлиге。 iOS + TensorFlow + CoreML 具有Core ML和TensorFlow的iOS 11中的智能手势识别 在第1部分中,我展示了如何使用深度学习来识别复杂的手势,例如心形,复选标记或快乐…… hackernoon.com Какпомне,потрясающийматериал。 在CoreML上进行操作。 Некогда,надопилитьтаскивджиреименятьцветакнопочек。 Потомувсянадежданатрушныхгиков,которымневломкодитьпоночам。 Статьяпоссылкевышеоднаизпервыхласточекнаэтутему。 Идеявследующем。 Пишемпрогунателефон,котораясобираетвсякиежесты(крестикитам,сердечки)。 Скриптнапистоне,чтобыобучитьмодельку(авториспользуетправославныйTensorFlow,хотяэтонеобязат ФинальноеiOSприложение,котороеумеетреагироватьнетольконастандартные轻按,滑动,pinc和аинассекуюфиг Понятно,чтонемногонадумано,нотутважнаидея。 […]

面向绝对初学者的软件开发摘要

如果您是软件开发生态系统的初学者,那么您迫不及待想要开始开发Badass Web应用程序,移动或桌面应用程序。 也许您在确定以哪种编程语言或平台开始时遇到问题。 我应该从Web应用程序还是移动应用程序开始? 如果是移动设备,我应该针对Android,IOS或Windows设备进行构建吗? 还是我应该全部学习? 我应该学习哪种编程语言? 哪一个是什么? 您在线阅读的语言越多,就越会感到语言困惑。 我完全理解你的困境,而你并不孤单。 撰写本文的目的是为您大致了解技术行业,现有平台(Web,移动和桌面,{Android,Windows和IOS}),构建所需的工具和编程语言。每个平台。 我将尽可能简单地讲一些技术术语。 网络应用程序 : 首先,您需要一台PC(个人计算机),浏览器(Chrome,Firefox,Edge等)和一个文本编辑器(记事本,Sublime Text,Visual Studio Code等)。 Web开发可以分为前端和后端 前端 :这是Web应用程序的可见部分,手势和感觉。 专门从事前端开发的人称为前端开发人员(或网页设计师)。 我需要知道什么语言? · HTML (超文本标记语言):HTML是标记语言,而不是编程语言。 它是每个Web应用程序的构建块,因为没有Web应用程序就无法存在。 就像在没有基础的情况下盖房子一样。 ! HTML是每个Web应用程序的基础。 · CSS (级联样式表):如果HTML是Web应用程序的构建块和基础,则CSS使HMTL更加美观。 想象一下一个没有油漆的房子,这就是没有CSS时HTML的外观。 CSS负责颜色,文本大小,动画,响应能力等等。 · JavaScript :它可以处理Web应用程序的交互性,例如验证,高级动画,DOM操作。 后端 :这是最终用户看不到的部分。 它涉及从用户获取输入到数据库并向用户提供反馈。 一个很好的例子是登录过程。 用户输入他/她的电子邮件/用户名和密码。 这将接受输入并验证用户的信息在数据库中是否可用,如果可用,则将用户重定向到特定页面,如果没有,则向用户提供未经授权的消息作为反馈。 构建后端体系结构的人称为后端开发人员 。 同时执行后端和前端的人称为Full Stack开发人员 。 我需要知道什么语言? 基本上有不同的Web后端编程语言。 · PHP , Python […]

吉特·胡克斯

当git在2005年推出时,它不仅改变了Linux社区,而且改变了许多开发过程。 突然之间,您不必再在一个分支机构工作了。 相反,您将为每个功能创建一堆分支,甚至更改一个分支并在以后合并它们。 它是如此的简单和快捷,没有理由不再这样做。 即使在创建新项目时,Xcode也会为您设置一个git存储库。 我记得与Perforce一起工作,与git相比,这是一个很大的麻烦。 检出文件,使它们不再受到写保护,检查哪些文件已更改,忽略本地用户相关文件(尤其是有关.xcodeproj文件的文件),并尝试在创建后合并几个月。 拥有两个不同的开发分支并没有真正帮助。 由于git是一个很好的工具和事实上的标准,我不会详细介绍如何使用它,但是有一个很好的功能,并不是每个人都知道。 钩子 Git可以选择向每个提交添加钩子。 根据您添加的钩子,将执行不同的用户定义脚本。 一些可用的挂钩是: Applypatch-msg 预先贴布 申请后 预先提交 准备提交消息 提交消息 准备提交消息 prepare-commit-msg挂钩将执行一个脚本,该脚本获取作为第一个参数$ 1传递的提交消息。 有了这个,我们现在可以根据需要任意更改消息。 在讨论有关提交消息的约定时,让我们检查容易忘记的内容以及可以自动化的部分: :以现在时的描述 由于我们为分支机构指定了票证名称,因此很容易提取: $(git branch | grep ‘*’ | sed ‘s/* //’) 此外,我们可以通过提取消息的第一部分并将其与我们拥有的不同类型进行比较来检查提交的类型: value=`cat $1` type=”$( cut -d ‘:’ -f 1 <<< "$value" )" contains=$(echo ${typeList[@]} | grep -o type | wc […]