Tag: 初学者

应用程序开发的入门故事

“嘿! 您是否想知道以经验有限的人的身份制作应用程序是什么感觉? 好吧,这个问题很夸张,因为您单击的文章非常抽象。” 为了给本文提供背景信息,我和我的搭档正在为软件产品开发课程制作一个应用程序,目的是学习协作的最佳实践。 我的合伙人在后端工作时,我负责应用程序的移动/客户端。 我们俩都是编程/软件开发的新手,时间表也大相径庭。 规划过程 尽管不仅开发软件而且进行协作工作对我来说都是新的,但我知道计划和研究必要的材料,适当地确定项目范围并为基于开发过程的清晰路线图至关重要。在我们的技能水平上。 遵循这些粗略的准则,我和我的合伙人可以平等地委派任务,以提高开发过程中的个人效率。 在第一周,我们计划在整个学期中定期召开每周会议,并决定在项目的计划过程中花费两个星期。 我们决定花两个星期的时间来计划自己,以便有足够的时间在其他课程上取得领先。 我们在计划过程中能够完成的工作: 为我们域内的应用程序集思广益。 确定了MVP(最小可行产品)及其之后的版本/扩展目标。 在Trello板上列出必要的任务和准则。 确定对应用程序的必要研究。 将任务适当地委派给每个人。 制定线框和项目时间表。 头脑风暴时的白板(上图)。 在我们的集思广益会议期间,我们决定做出一些能够解决旅游/探索问题的事情。 更具体地说,我们想开发一款能够激励和激励人们去探索自己的地区并在旅行过程中轻松地导航新的陌生地区的应用程序。 我们的解决方案 我们的解决方案是创建一个可用作个人导游的应用程序,奖励用户步行即可到达景点。 我们的主要目标是对探索进行游戏化,以鼓励人们更多地走出去,并帮助不喜欢旅行的旅行者。 在讨论这些目标时,我的一位同学同意这一观点,说: “制定行程会浪费一半的乐趣。” 我们决定采用此想法的另一个原因是,我们希望在可能会很有趣的同时又提供足够的空间使其复杂并具有更多功能,从而使之有趣。 详细的应用程序 该应用程序将使用自定义api向用户显示要探索的各种位置,这些位置均在用户位置的步行距离内。 一旦用户选择了感兴趣的位置,该应用程序便会将用户重定向到Apple地图。 我们的主要激励机制是与用户互动的吉祥物/伴侣,并向用户奖励各种化妆品,以指示他们探索了多少地方。 这个应用程序的主要目的是游戏化探索,以鼓励任何人走出家门,并在自己的家乡或旅行时探索他们所在的地区。 我们对该应用程序的灵感来自一位同学向我们提出的类似想法。 他们正在制作一个应用程序,该应用程序将允许用户沿用当地人创建的路线,以探索和发现不同的区域(类似于地理缓存)。 另一个灵感来源是《神奇宝贝GO!》,这是因为它们使用了游戏化的现实世界探索以及其中包括的他妈哥池方面。 经过广泛的计划,下一步就是开始开发。 冲刺计划和回顾: 在开始编写第一行代码之前,我们需要计划冲刺。 “冲刺计划”是在短期会议上进行的,小组在此期间确定在特定时间段内要完成的任务,确定特定任务的优先级并设定小组目标。 在小组中,我们将冲刺设置为两个星期,并为我们每个人委派了一些任务,从而使我们有足够的灵活性来完成其他课程的工作。 冲刺结束后,我们还计划召开回顾性会议,以回顾迄今为止的进展和工作质量。 我们在这次会议上提出的问题包括:1)进展顺利吗? 2)什么进展不顺利? 3)我们是否需要重新安排积压的优先级? 和4)在下一个Sprint中我们可以做哪些小的改进? 在这段时间里,由于社区事件和/或无法控制或意外的情况,我们通常转移并重新安排任务的优先级。 糟糕,存在一些问题: 即使经过了广泛的计划,也可能总是存在一些无法控制的因素,使工作陷入僵局。 我们在执行此项目时遇到的一些问题是: 疾病 无法互相追究责任 拖延 无法有效地概念化 缺乏沟通 由于这些问题大多数与组织和团队合作有关,因此在感恩节期间,我们召开了一次长期回顾会议,在会议上我们分析了自己的优缺点,并制定了一项计划来帮助我们克服挑战。 […]

切换动量(Web-> iOS)

成为自学成才的iOS开发人员似乎很艰巨…… …或者至少它起初看起来像它。 随着移动设备在21世纪变得越来越普遍,这无疑是当前最酷,最令人兴奋的领域之一。 也许在未来5-10年内完全取代我们的台式机和笔记本电脑……?🤔 Swift是Apple推出的一种新的但很有前途的编程语言,正在越来越流行。 目前,它是第4版(非常稳定)。 Xcode仍然很痛苦。 ARKit看起来太酷了-随着iOS Beta和设备的推出,这很有希望。 开发人员社区是超级支持。 (不适用Twittersphere) **我将在另一篇文章中介绍AR / VR技术。 那将是主要的。 来自Web开发(JS)的背景,Swift语法非常容易掌握。 而且不要让我开始了解Swift / Android的Kotlin相似之处。 再见,Java? 👀 作为iOS开发人员到达那个地方将花费大量时间,练习和浪费很多咖啡。 自2017年底以来,我一直在这里和那里散列一些小型教程,以了解创建iOS应用程序所需要的内容。 来自具有编程经验的Web开发人员背景,切换非常好。 去年,我已经厌倦了在WordPress和Shopify店面。 Web应用程序很棒,但是基于客户端的主要是没有初始上限的初创公司。 设计网站和移动应用程序很有趣-我可能仍然会坚持下去。 试图找到原因。 ♂♂️ 我目前正在和一位朋友一起挑战,每天至少构建一个“虚拟”应用程序。 这些“虚拟”应用程序只是展示了我最近通过测试所学到的概念或很酷的框架。 我很快会在一系列文章中分享。 我在GitHub上有一些应用程序的仓库。 其中大多数来自教程。 一些是精美的复制品,在此和那里进行了一些更改。 在大多数情况下,每天在学习新概念的同时创造一些东西是有益的。 它可以建立信心,特别是当您在没有帮助的情况下开始自己创建简单项目时。 *诚实的更新* ,哎呀,我目前落后三(3)个应用程序。 我的家伙,这个超级碗嘉年华真的很疯狂。 🦅🏆 从Web开发人员那里休息可能会令人生畏,尤其是因为框架等不断变化。 很大程度上解释了我转向更加稳定的事情。 我仍然很喜欢网络。 我不会离开你的 ❤️ 无论如何,这是我接下来几个月要关注的几个主题。 这里的大多数概念和范例都将有助于您进行iOS技术面试。

适用于初学者的iOS多线程策略

并发是编程中最复杂的(读作“ 吓人” )主题之一。 这是一个非常强大的工具,可以为您的应用程序带来魔力。 但是,如果使用不当,还会带来讨厌的问题。 作为iOS的初级程序员,如果不知道如何挥动这把双刃剑,就无法改善。 今天,我将帮助您在iOS中使用多线程。 什么是线程? Apple的文档将线程定义为“一种在应用程序内部实现多个执行路径的相对轻量级的方法。”为了简化起见,您可以想象每个线程都是一个cookie怪物,每个cookie怪物都有自己的cookie队列(代码等待执行)。 多线程很棒。 iOS要求在主线程中执行与UI相关的代码。 将UI代码想象成M&M cookie; 因此,所有M&M Cookie只能进入主要Cookie怪物。 如果我们只有一个Cookie怪兽,其中包含许多种Cookie(用于UI的M&M,用于网络连接的巧克力芯片等),那么M&M Cookie的执行速度将非常慢,因为其他Cookie太多了。 我们会看到该应用程序的响应速度不太快,甚至会冻结,因为主要怪物无法足够快地进入M&M Cookie。 采用并发就像让多个饼干怪兽吃饼干一样。 如果您可以指定一个怪物只吃巧克力(网络处理)饼干,一个怪物只吃花生酱(数据存储和缓存)饼干,并且仅将M&M(UI)饼干喂给主要的饼干怪物,那么所有饼干将以更快,更清洁的方式被食用。 这就是多个线程如何提高应用程序性能的方式。 您可以通过两种常见的方式在应用程序中放置更多的Cookie怪物:Grand Central Dispatch和NSOperationQueue。 第一种方式:大中央调度(GCD) 由于这是针对初学者的指南,因此我将开始介绍如何以最简单的方式使用GCD。 让我们将一个cookie怪物的cookie行命名为“调度队列”。 您可以通过以下方法获取公共调度队列: dispatch_get_main_queue :这是主线程的队列。 dispatch_get_global_queue :系统为每个应用程序提供四个并发调度队列,您可以使用此方法获取任何共享的并发队列。 它们非常适合于后台任务。 dispatch_get_current_queue :这将返回当前队列 您还可以通过dispatch_queue-create(queue_name, NULL).自己的串行调度队列dispatch_queue-create(queue_name, NULL). 现在您站在传送带(队列)上,开始将每个cookie(代码)包装到袋子(块)中。 您可以通过两种方式分发cookie:(1)将打包的cookie放在队列中,然后继续制作其他cookie和执行其他任务。 在这种情况下,您不必担心Cookie何时到达Cookie怪物,或该Cookie之前或之后有多少Cookie; (2)这是一个重要的cookie,您可以停止等待cookie到达cookie怪物。 在这种情况下,您尝试执行其他任何操作之前先确保已吃掉Cookie。 对于第一种情况,您是异步地将代码块分派到队列中。 在代码中看起来像这样: 第二种方式:NSOperationQueue GCD是同时分发Cookie的一种很好的简单方法。 但是,当您的cookie工厂变得越来越复杂时,您将需要对cookie和cookie行进行更多控制。 现在该探讨NSOperation和NSOperationQueue。 NSOperation是一个智能盒,您可以将其放入Cookie中。 其中一些可以包含多个cookie,一些可以处理自定义大小的cookie。 您可以指示小甜饼怪兽如何在每个包装盒中食用小甜饼,并以不同的优先级标记它们。 框中有一些按钮,可让您将Cookie标记为“已过期”(取消操作),还具有标签来显示Cookie是被食用还是已完成。 NSOperationQueue是用于处理智能盒子的升级传送带。 […]

‘功能性’Swift#5:JSON提取和解析

在前面的部分(1、2、3、4)中,我们已经看到了如何将一系列保护语句重写为简单的函数链,并将其扩展为返回Result类型。 在本文中,我们将使用相同的技术(使用可选版本)来获取和解析JSON文件。 首先,我们需要JSON: [ { “ title”:“ Title1”, “字幕”:“ Subtitle1” }, { “ title”:“ Title2”, “字幕”:“ Subtitle2” } ] …以及解析为…的类型 结构项:可编码 { var标题:字符串 var副标题:字串 } 请注意,该结构被标记为符合Swift 4 Codable协议。 现在,让我们为文件路径提供一个帮助程序类型(并非绝对必要,但我认为它使我们正在处理的类型更加明确): 结构文件路径 { private(set)var值:字符串 init?(在捆绑包中:Bundle = .main, ofType fileExt:字符串=“ json”, 命名名称:字符串?) { 守卫让路径= bundle.path(forResource:name, ofType:fileExt) 否则{return nil} self.value =路径 } } 现在我们可以构建我们的展开函数: 结构展开 { typealias StringToData =(字符串)->数据? […]

可视化初学者的循环输入(Swift 3)

熟悉循环对于使用任何语言进行编程都是必不可少的,而且当您刚入门时,事情可能会变得有些混乱。 在本文中,我将提供一些基本示例,这些示例应有助于您直观地了解运行时for-in循环在做什么。 这应该使您更好地了解代码的执行方式以及使用循环的时间。 基本 在第一个示例中,让我们看一个标准的for-in循环。 在此循环中, 索引从1的值开始,并且每次我们迭代for循环直到索引达到5时, 索引都会增加1。 for循环中唯一的语句是print(index) ,它在控制台的新行上打印index的值。 这样我们得到以下控制台输出。 与其将这些数字打印到控制台,不如将它们添加到阵列中。 在这里,我们从一个名为myArray的空数组开始,然后使用append(index)方法将index的值添加到myArray中 。 每次我们迭代for循环时都会调用append()方法……因此我们将索引值相加5次。 若要查看实际效果,请在for循环内添加print(myArray) 。 我们可以通过for循环的每次迭代来观察myArray的状态! 对于通过for循环的每次迭代, 索引值 被附加到myArray的末尾,然后打印到控制台。 嵌套循环 当您在一个循环中放置一个循环时,这称为嵌套循环。 在编码时,它并不总是最有效的解决方案,但在浏览或创建新集合时可能很有用。 当您运行具有嵌套循环的程序时,很难准确地分辨出每个循环在做什么以及何时执行。 希望这些示例将帮助您可视化for循环如何构建或移动数据。 看一下下面的字符串数组 。 blueEmojis包含5个(精心选择的)蓝色emoji表情, redEmojis包含3个(完全随机)红色emoji表情。 让我们使用一个for循环从我们丰富多彩的集合中制作字符串。 在这里,我们声明了一个变量,它将保存我们的表情符号字符串。 在它的下面,我们有了第一个for循环,以循环访问blueEmojis Array 。 emojiString以空白字符串开头。 使用for循环,我们可以在其中附加表情符号! 接下来让我们分解一下for循环〜 blueEmoji (否)表示blueEmojis 数组中的单个值。 blueEmoji以blueEmojis中第一项的值开头 ,并使用.append(blueEmoji)将其附加到emojiString中。 它遍历数组,直到所有值都被迭代为止。 让我们看看如果在循环中添加print()函数会是什么样子。 如您所见, blueEmojis数组中的每个表情符号都已添加到emojiString中并打印到控制台 每次我们迭代for循环时。 现在让它嵌套在redEmojis 数组的另一个for循环中, 并带有自己的append()和print() ,看看会发生什么! 如果我们查看控制台,可以看到在添加第二个blueEmoji之前,所有三个redEmojis都已添加到字符串。 这意味着在blueEmoji for循环可以完成一次迭代之前, […]

“功能性” Swift#2:使用运算符进行合成

直接从上一篇文章开始,我们现在将开始更深入地研究功能性内容。 这是我们最后一次到达的地方: 让stringToURL:(String)-> URL? = {URL(string:$ 0)} 让urlToData:(URL)->数据? = {试试? Data(contentsOf:$ 0)} 让dataToImage:(数据)-> UIImage? = {UIImage(data:$ 0)} 让stringToImage:(String?)-> UIImage? = { $ 0.flatMap(stringToURL).flatMap(urlToData).flatMap(dataToImage) } _ = stringToImage(“ https://placebear.com/200/300”) 在可重用性方面,这是对原始版本的巨大改进,但我们可以走得更远。 在每个调用中都会重复flatMap调用,因此我们可以将它们归为一组吗? 让stringToURL:(String)-> URL? = {URL(string:$ 0)} 让urlToData:(URL)->数据? = {试试? Data(contentsOf:$ 0)} 让dataToImage:(数据)-> NSImage? = {NSImage(data:$ 0)} func fMap (_ fnc:@转义(T)-> U?)->(T?)-> U? { 返回{$ 0.flatMap(fnc)} } […]

还是这样……

在编程中,通常有很多不同的方法可以达到相同的目的。 我在上一篇文章(“功能性” Swift#6:视图样式)中提出了一些想法。 以下是解决同一问题(设计视图样式)的其他10种变化。 有些只是其他的小变体,这是为了演示Swift语言功能或模式。 在本文中,我将不加评论或推荐地介绍这些内容。 它们都是实现相同结果的有效方法,每种方法都有其位置。 逐行 让myBtn = UIButton() myBtn.backgroundColor = .red myBtn.frame = CGRect(x:10,y:10,宽度:30,高度:30) myBtn.isUserInteractionEnabled = true 2.子类(和变体-通过参数/样式方法/ layoutSubviews覆盖样式等传递样式) 类MyButton:UIButton { 覆盖init() { super.init() self.backgroundColor = .red self.frame = CGRect(x:10,y:10,宽度:30,高度:30) self.isUserInteractionEnabled = true } } 让myBtn = MyButton() 3.使用(例如:使用然后) 让myBtn = UIButton()。with { $ 0.backgroundColor = .red $ 0.frame = CGRect(x:10,y:10,宽度:30,高度:30) $ […]

适用于初学者的iOS开发。 第3部分:准备面试

在本教程的最后部分,我将指导您如何为初级开发人员职位做第一次面试。 正如我在本文中提到的那样,我参加了关于我的职业这两个角色的数百次采访。 大约10年前,我开始了iOS开发人员的职业生涯,可以肯定的是,今天的要求会更高,但是如果您准备得很好,就会成功。 当我只有中层职位时,很少几次我甚至雇用了经验最少的人。 它怎么发生的? 他们证明自己很聪明,可以完成任务。 检查本文以了解该做什么和期望什么。 必要的知识 参加面试之前,请确保您已准备好。 下面,我将为您提供通常讨论的最重要领域的简短清单。 Swift语言功能 正如我在本教程的第一部分中提到的那样,Swift是iOS App开发的第一选择。 而且您需要知道如何使用它。 这里列出了即使在纸上也应该能够写的最重要的东西: 创建变量,了解let / var差异 了解让选件如何工作(如果满足条件) 参考文献薄弱,一些基本的内存管理知识也将是不错的补充 使用数组和字典(创建,计数,插入,删除) 使用字符串(创建,计数符号,添加子字符串) 创建自己的结构,类和方法 If..else和switch..case条件 For周期 Xcode Xcode为您提供了一个非常用户友好的界面,因此,很容易学习如何使用它。 你应该能够: 创建一个新项目并附加CocoaPods 在iOS模拟器和设备上运行您的应用 调试您的应用(使用控制台输出了解问题所在) 将您的应用提交到App Store 界面生成器和UIKit Interface Builder是Xcode的一部分,您可以在项目窗口中打开XIB或Storyboard文件时看到它。 目的是使构建用户界面尽可能容易。 UIKit框架是iOS SDK的一部分。 它包含UI组件和控件。 使用Interface Builder,您可以使用UIKit组件而无需编写任何代码。 这就是为什么我这次将两者结合在一起的原因。 你应该能够: 在Storyboard中为您的应用( UINavigationController , UITabBarController , UISplitViewController )创建导航模型 了解新的ViewController的模式表示和UINavigationController推/弹出机制之间的区别 使用Storyboard Editor创建一个新的ViewController并将其与代码中的类连接 在ViewController之间创建序列 […]

自学系列| iOS Swift | 第二课:介面开发(UIKit)第1部分

前言:为什么会有「自学系列」 当我还是程式初学者时,觉得自学最麻烦的就是:那些课程大纲,专有名词我根本看不懂。如果有个已经会的人直接跟我说要学什么,给我一个概述,可以省下很多时间。 关于iOS App自学系列我已经写了两篇,有兴趣可以去看看。 自学系列| 斯威夫特| 用免费的线上学习资源入门iOS App 初学者到底有什么基本东西要学? medium.com 自学系列| iOS Swift | 第一课:开发工具+ App基础观念+基础UI 用AVFoundation做一个简易变声App medium.com 简介文章是Udacity iOS应用程序Nanodegree第二课的导读,透过做成这个影片中的App,熟悉介面开发常见的几个元素。 第二课连结在此 ,我们将学会底下几个主题。 UIKit基础知识:了解iOS用户界面库| Udacity 了解iOS UIKit框架,这是在所有iOS应用程序中创建用户界面的基石,对任何其他应用程序都至关重要。 www.udacity.com 1.重点观念 代表 Delegate对初学者而言是一个逃不掉的魔咒,记得自己初学Delegate时,不懂为什么要有这种东西,只会一个案例,一个案例照抄。三个月后大概可以不再参考案例,顺顺地自己写出Delegate,直到最近写这篇文章,我才觉得有点理解它了。 先帮大家打个预防针: 有时候学东西是这样:先照抄➙会自己写➙练习很多很多次之后,终于理解为什么要这样写。 Delegate是代理人的意思,在上一篇有提提过,它是一种写程序的方法(设计模式),用于当A想叫B做事情的时候。还记得MVC吗?View(介面)负责呈现画面给用户,Controller则是负责处理逻辑,例如Controller会根据一些逻辑,告诉查看现在要变成什么画面。 所以,很多时候查看会分配控制器为Delegate(代理人),问Controller现在要如何呈现自己。 举凡为呈现多种资料的UITableView,UICollectionView,呈现文字的UITextView,UITextField,选择日期,数字的UIPickerView …等等,都会用到Delegate。 协议就是这样的东西,遵从Protocol的代表就会有要执行的功能。底下用UITextField视为示例。 UITextField UITextField用于输入文字(如左图红色框局部)。 在第二课的范例中(右图),三个TextField的文字呈现都不同,表示这三个TextField是不同的代理人(代表): 第一个Delegate可以把动物的单字变成表情符号(例如cat变成🐱) 第二个Delegate会根据单字改变句子的颜色(例如红色) 第三个Delegate会算出句子的字数 这三个Delegate都遵从UITextFieldDelegate这个协议,所以当我们输入文字时,三个代理人就要执行该协议 func textField(UITextField,shouldChangeCharactersIn:NSRange,replaceString:String) 这个功能,差异只是功能里的逻辑要写什么,决定文字会怎么变。就像外交官出席活动一定要发新闻稿,但新闻稿内容要写什么,则因人而异。 2.资料呈现 UITableView / UICollectionView 仔细观察的话,你会发现多数的App都用到TableView或CollectionView。 TableView就是一行一行排下来的,像iPhone内建的设定(左图),Line,Messenger,邮件,备注,YouTube,Facebook …等等,CollectionView则是一格一格的,像instagram(右图),照片,旅行青蛙购买道具和放明信片的页面…等等。 TableView跟CollectionView都要用到Delegate(所以Delegate真的逃不掉!),以TableView来说,就有UITableViewDelegate,UITableViewDataSource这两个。UITableViewDelegate负责处理使用者产生的行为,例如当使用者点选表格,编辑表格时,要怎么回应; […]

iOS XCode简介

一直想构建一个应用程序吗? 不知道怎么办 我也不是,直到我参加了一些在线课程,发现它并不难(构建一个简单的应用程序)。 您也可以遵循本指南并熟悉XCode。 我目前是Flatiron School的沉浸式Web开发计划的学生,并且在周日通过Udemy在App Brewery学习Swift,所以我非常了解学习开发方法会令人生畏。 在这篇文章中,将没有任何编码。 我们将着重于让您设置并熟悉众多XCode面板。 在此处安装最新版本的XCode。 您至少需要第二至最新的macOS版本才能使用最新版本的XCode。 如有必要,请在此处更新Mac。 在macOS Mojave上运行的XCode 10演示了以下步骤。 根据界面的长短,界面可能会完全相同,也可能不同。 对于“组织名称”,您可以输入您的名字。 对于“组织标识符”,Apple要求使用反向域标识符。 那就是“ com”。 就像我们以前所看到的那样,在前面而不是结尾。 您想选择Swift是因为C ++正在逐步淘汰用于iOS开发。 我们不会针对此应用进行任何测试,因此请取消选中所有复选框。 以“ .swift”结尾的文件是您的代码文件。 以“ .storyboard”结尾的文件是您的设计文件。 “ Assets.xcassets”文件夹包含您的所有媒体文件。 您可以更改预览中显示的设备,这会直接影响您构建的应用程序的尺寸。 我将其从iPhone 8更改为iPhone XR,但是您可以选择任何设备,并且仍然可以正常使用。 让我们关闭视图面板,因为您想给自己尽可能多的工作空间。 选择最吸引您的字体。 如果看不到整个设备,请稍微缩小一点。 更新标签。 重新打开视图面板。 选择您的背景色。 我在Apple的预设颜色选择中使用了彩色铅笔选项,但是您可以通过所需的任何方法选择任何颜色。 花一分钟时间单击一下,然后使用颜色面板。 对于不同的设备,您将需要不同大小的同一图像,但是有一个很棒的网站appicon.co可以为您调整图像大小。 输入图像名称以找到图像。 在视图面板中,将图像拖动到标签上方,使其在标签之后分层。 在预览屏幕中,将图像拖到标签所在的位置。 现在我们在您的文本后面有一个黑板,让我们将文本颜色更改为白色。 有时,您的图片默认情况下会失真(在这种情况下不会),您可以通过“内容模式”属性更改图片的行为。 当您想要图像或标签的特定位置(由客户或设计团队提供)时,可以使用标尺面板输入所需的位置。 我知道您想要从0到100,但这就是这篇文章。 花一些时间来熟悉我们经历的所有面板。 有很多面板可供查看和记住,但是…… 恭喜您迈出了成为iOS开发人员的第一步!