Tag: 编程

为什么在线编程课程就像体育馆订阅。

以及如何通过应用4 Hour Body和Freeletics方法真正成为收入最高的程序员。 广告策略-更好的您 学习编程需要改变行为。 做某事的长期承诺可能是您不习惯的。 健身房的类比很直白。 获得健身卡不会使您变得更健康,而持续进行锻炼则会使您变得更健康。 不幸的是,在线编程课程的经济学侧重于按下与健身房相同的按钮。 毕竟,这是每月订阅的相同业务模型。 为了使您更好地了解自己的形象,需要进行很多预售。 您想成为的人,一个更好的自己: 让我们看一些领先于在线课程的广告技巧,这些技巧与这种策略非常相似: [COURSE NAME]不仅消除了对移动应用程序进行编码的恐惧,而且使它变得有趣。 [课程名称]向我展示了我想要做的事,直到今天,在家学习Web开发已被证明是我一生中最好的决定之一。 售后—内lt 购买健身卡并订阅在线课程会怎样? 该程序将告诉您该怎么做。 这样做很长时间。 不要跳过培训。 走。 从您成为客户的那一刻起,您基本上就是一个人。 此外,当您无法跟上时,可以去健身房或定期观看教程。 怎么了? 正确-内the卡被使用。 我们不能为您在5:00醒来,现在可以了吗? 我以为您说过想用Swift学习iOS开发–是不是说要改变生活? 好吧-这就是需要的。 每天学习3个小时。 每天。 6个月。 然后您会到达那里。 没有? 好吧-谁该怪? 会坚持吗? 蒂姆·费里斯(Tim Ferris)在他的《四小时的身体》(4 Hour Body)一书中建立了一个我在教学生必须使用的学习策略时经常使用的测试。 该测试称为“导带测试”。 还有一个简单的问题:“会坚持吗?”: 每天砍蔬菜和清洗Cuisinart三次,将导致一个地方:放弃该方法。 这是否意味着某些人无法使用? 不。这只是意味着它将对大多数人失败。 认真对待坚持:在达到目标之前,您是否会坚持这一改变? 如果不是,请寻找另一种方法,即使该方法效率较低且效率较低。 您遵循的体面方法比您退出的理想方法更好。 经过测试 我已经对自己进行了测试。 我有多年的健身卡,很少去那里。 然后我找到了Freeletics。 我可以看到前两周的最初结果。 动机不再是问题。 我减掉了8公斤。 […]

iOS开发基础知识:循环,条件

在这里,我们再次慢慢地成为一名出色的iOS开发人员。🙂在本课程中,我们将经历循环和条件。 首先让我们看一下循环。 循环 循环用于遍历数据集合并对其执行一些任务。 我们知道Swift中的三种循环: while , repeat-while和for-in 。 While循环 var homeworkDone = false 而!homeworkDone { 打印(“做我的作业”) } 尽管这不是while循环的很好示例,但我希望您了解它是如何工作的。 这很简单,虽然homeworkDone不是正确的,但它会打印“正在做作业”。 为什么这是一个不好的例子? 因为它将永远运行,因为我们没有更改homeworkDone变量,所以那不是确定的 。 这个例子不错,只是为了让您了解它是如何工作的。 重复循环 变数= 0 重复{ 数字=数字+ 1 }而数字<10 你觉得和重复的时候很相似吗? 唯一的区别是此代码在检查条件之前执行了代码。 循环内 var carsInMyGarage = [“特斯拉S型”,“三菱蓝瑟X”,“高尔夫R”,“焦点RS”] 用于carsInMyGarage中的汽车{ 打印(汽车) } for-in循环用于循环遍历数据集合并对其进行处理。 在这种情况下,我们将打印carsInMyGarage数组中的每辆车。 “ Car”只是临时存储数组中数据的变量,您可以随意调用它。 通过此循环,您还可以循环显示一系列数字。 您可能会这样: 1 … 5中的数字{ 打印(数量) } 这将打印从1到5的数字。您也可以使用以下非包含范围: 对于1 .. […]

Swift中的设计模式:工厂模式

欢迎来到一系列致力于学习设计模式的文章。 尽管许多想法与代码无关,但我们的目标是向您展示如何在Swift中实现它们(在撰写本文时为Swift 3.0)。 每个帖子彼此独立,所有项目代码都可以 在Git上找到 。 传统上,工厂模式是面向对象语言中使用最多的模式之一。 Factory模式的作用是在运行时使用多态为对象分配一个类。 当客户端不知道所需的确切类时使用它。 所有可能的类都从相同的超类扩展(或实现相同的接口),从而为我们提供了许多可供选择的类。 神奇宝贝就是一个容易证明的例子。 入门级神奇宝贝(Bulbasaur,Squirtle和Charmander)都属于神奇宝贝。 他们有共同的特征。 例如,它们必须具有名称,并且必须具有类型。 但是,尽管它们需要名称和类型,但每个神奇宝贝的名称和类型都不同且有所不同。 这在代码中意味着什么,就是我们有一个神奇宝贝超类。 该超类将包含对名称和类型的引用。 然后使用继承,我们继承了共同的特征,并针对我们想要的神奇宝贝专门对其进行了操纵。 我们将构建一个程序,询问用户他们希望他们的入门神奇宝贝是什么,然后将正确的选定数据返回给用户。 以下是UML图中的外观: 码 首先,在Xcode中创建一个新项目。 我们不会在UIKit中碰任何东西,因此创建一个macOS Terminal项目。 首先,我们将创建所有神奇宝贝都将继承的神奇宝贝超类。 它看起来像这样: 接下来,我们将创建每个单独的神奇宝贝。 这些类非常简单。 它们只需要初始化,在初始化期间,我们将设置名称和类型。 这些看起来像这样: 现在我们需要创建实际的工厂类。 这是上演魔术的课。 它将包含一种方法。 我们将为其提供一个字符串,作为回报,它将基于该字符串为我们提供一个神奇宝贝对象。 它看起来像这样: 请注意,由于神奇宝贝可能为nil ,我们需要使用问号将其设置为可选。 将它们放到我们的主类中将如下所示: 我们要求用户选择一个神奇宝贝。 如果存在,则返回正确的神奇宝贝,如果不存在,则向用户显示一条消息。 运行程序。 这是一个示例,如果您为Bulbasaur选择“ B”,您将在终端中看到以下内容: 选择您的首发口袋妖怪​​(B =鼠尾草/ C = man火鸡/ S =松鼠) 乙 您选择了Bulbasaur。 这是草宝可梦 程序以退出代码结束:0 多数民众赞成在工厂模式完成! […]

开始进行Swift编程,第7部分-初始化和反初始化,覆盖和引用计数

在上一篇文章中,我们讨论了结构,类,属性和方法。 开始进行Swift编程第6部分-结构,类,属性和方法 在上一篇文章中,我们介绍了函数,枚举和范围。 medium.com 它帮助我们弄清楚如何创建对象以及将类似的属性和方法组合在一起。 本系列的内容不会教您Apple提供的更具体的类,例如UIButton或更实际的URLSession。 它会教给您足够的知识,因此当您在自己的程序中看到这些类时,您将对如何开始使用它们有所了解。 因此,让我们深入研究这一课。 从最基本的意义上讲,类和结构的初始化是为类和结构提供值。 有时,我们希望类或结构在创建时具有默认值,而其他时候,我们想告诉类或结构其默认值是什么。 初始化Class和初始化Struct之间的区别是:Swift中的Struct有自己的默认初始化器 ,而Classes没有。 这是什么意思? 这意味着当我们创建结构时,我们不需要在Struct中包含init()方法,它会自动为您创建。 仅当创建类时未实例化该类的属性时,类才必须具有init()方法。 让我们看看我在说什么。 在myFullyInitializedClass我们可以使用 var myFirstClass = myFullyInitializedClass() 。 如果要使用myFirstClass.myFunction()调用函数,则它将返回整数1因为我们为该类设置了初始值。 在myNonInitializedClass ,我们需要传入给定的givenNumber来创建它,以便初始化该类的所有属性。 在这种情况下,我们只有一个属性,但是如果有更多属性,则必须传递所有默认值。 只需将init()方法想像为目前没有func关键字的函数即可。 其唯一目的是为类中的属性分配值。 当我们调用方法myFunction ,它将返回值2 。 在myStruct示例中,我们没有初始化程序,因为在后台为我们创建了默认初始化程序。 创建新结构时,我们使用var myThirdStruct = myStruct(firstNumber: 3) 。 不,我们没有创建3个结构,但我以这种方式命名,因此您可以看到类和结构的总体顺序。 我们可以调用myThirdStruct.myFunction ,该方法将返回3 。 如果我们要创建一个myStruct的新实例,而不传递第一个数字的默认值,则会收到错误消息。 因此,对于结构,您必须设置默认值或在调用它时传递一个默认值。 可以在类和结构中使用Optionals以满足初始化程序的要求。 假设您创建的类并不总是需要其所有属性。 我们可以将不需要的属性设置为立即可用。 通过使用可选值,我们不必包括初始化程序,但是,如进一步所示,我们需要强制展开可选值,以删除设置了我们值的Optional()包装器。 我知道我告诉过您不要使用! ,强制解包,操作员。 但是如果没有更多工具可供使用,那么现在就必须这样做。 不用担心那些新工具即将推出。 如果您确实解开了nil可选项,则程序将崩溃,并且Found nil while […]

反向链接列表

我目前正在解决iOS开发人员遇到的常见数据结构/算法问题,并且反向链接列表就是其中之一。 我们需要做的第一件事是建立链接列表的基础。 因此,我们要做的是编译将成为列表的节点列表,oneNode,twoNode和ThreeNode。 让我们编写一个函数以打印出链接列表,以仔细检查所有文件的顺序是否正确。 查看打印输出。 为了真正理解我们应该如何反向链接列表,让我们使用一些箭头来指示每个节点如何相互引用以及其最终外观如何。 目前,我们的链接列表如下所示: 1→2→3→无 我们想要的是……。 3→2→1→无 反转列表的方式应如下所示: 无←1→2→3→无 无←1←2→3→无 无←1←2←3 我们要完成的工作与反转数组有很大不同,在这种情况下,您可以简单地从最后一个元素开始迭代,然后从第一个元素结束。 这是实际上反转指针并确保正确调整头和尾以及其所有下一个值的问题。 让我们看一下这里发生的事情。 我们将currentNode设置为等于头,即链表中的第一个节点。 currentNode还是在while循环中用于定义条件语句的变量。 接下来,我们还有两个变量,previousNode和nextNode,它们也将进行更改。 只要currentNode不等于nil,我们就想遍历列表,如果它变为nil,我们想跳出循环。 1→2→3→n的可视化在这里很有用。 因此,我们要做的第一件事就是将nextNode设置为等于currentNode的下一个节点。 因此,我们从列表开始,以1为头节点,然后将nextNode设置为2,因此nextNode = currentNode?.next。 然后,我切换了齿轮以在return语句之前编写最后一行代码,即currentNode = nextNode,因为对我而言,从逻辑上讲,当我们完成对所有其他变量的引用的更改后,我们需要一个新的头节点迭代并重新计算所有其他值。 现在是棘手的部分……我们该如何处理previousNode和currentNode的next属性? 在我们的循环中,到目前为止,previousNode的值是以下nil,1、2。如果要递增,我们希望这些值变为1、2、3或previousNode等于CurrentNode。 但是,我们仍然需要容纳currentNode?.next,它在更改它之前指向了previousNode。 本质上,我们在翻转currentNode?.next和previousNode的值,如果我们注释掉这一行,则您会注意到节点列表未打印,它的位置是3。currentNode?.next = previousNode有助于跟踪之前的哪个节点在thirdNode之前。 然后,当我们考虑外循环的下一个迭代时,我们将previousNode设置为currentNode,因为它是列表中的下一个节点。 最后,将currentNode更改为nextNode,以继续到下一个节点值。 您返回上一个节点是因为我们要返回链接列表中的新“头”或初始节点。

开始Swift编程第15部分-具有泛型和闭包的枚举

在上一篇文章中,我们讨论了错误处理。 开始进行Swift编程第14部分-错误处理 在上一篇文章中,我们讨论了泛型。 medium.com 我们介绍了有关如何创建自己的错误并在代码中使用它们而不只是崩溃的基础知识。 如果您有兴趣知道,我只剩下5个主题,然后向您指出一些我最喜欢的资源,这些资源可以帮助我编写程序。 本文将简短,但是它将结合一些我们已经学到的概念,并可能使您考虑如何以新的方式编写代码。 以前,当我们谈论枚举时,我告诉过您,它将为您提供选择的选项,而我们只限于那些选项。 我们可以在枚举案例中使用关联的值来定义使用枚举时将实例化的类型。 现在,我告诉您有关完全使用闭包,枚举和泛型的信息。 这是我从纳塔莎机器人那里学到的一个很酷的技巧,我在自己的代码中使用了很多。

Swift 101 —可选

今天,我将在博客中介绍Swift中的另一个基本概念-可选变量。 苹果将​​可选内容描述为: 您可以在不存在值的情况下使用可选选项 。 可选选项代表两种可能性:要么有一个值,要么可以打开该可选选项以访问该值,或者根本没有任何值。 可选变量有? 符号定义后告诉编译器该变量可能为nil 。 您可以在这里阅读更多关于nil信息。 为了将变量定义为可选变量,必须指定对象类型,例如Int , Bool或String 。 让我们看一个例子: var optionalInt:整数? var optionalBool:布尔? var optionalString:字符串? 您会注意到上面示例中的所有变量都是var ,这是因为在let时不能将变量分配为nil 。 可nillable对象必须始终具有以后可以分配具体值的能力,否则编译器将在内存中保留常量nil变量,而不能在以后进行更改(变异)。 在此处阅读有关let vs var更多信息。 因此,以下示例将无法编译: 让optionalString:字符串? 外卖小贴士 可选变量必须使用类型声明。 可选变量必须为var not let 。 在此处获取此博客的游乐场。 雨燕快乐!

斐波那契斯威夫特游乐场

假设您正站在一个有n楼梯的楼梯前面。 您一次只能上一两个楼梯。 您到达顶部的独特方式的总数将是多少? 如果我们知道到达n-1和n-2的方法的数量,那么到达n点的总方法就是将这两个值相加。 这实际上与计算斐波那契数列的第n个数相同。 在这里,我试图提出解决斐波那契问题的不同方法,其中包括算法比较以及围绕时间和空间复杂度的讨论。 递归方法 我们可以从递归方法开始。 假设我们已经知道所有先前的数字,所以不用说当前数字是最后两个数字的和(自顶向下方法)。 func fib(_ n:Int)-> Int { 守卫n> 1 else {return n} 返回fib(n-1)+ fib(n-2) } 时间复杂度:O(2 ^ n) 空间复杂度:O(2 ^ n) 该解决方案的问题在于,我们不断地重复计算相同的子问题。 换句话说,我们的算法做了很多重复的工作。 该算法呈指数增长,需要付出很多努力,尤其是当n大时。 迭代法 这种方法来自相同的想法,但稍有调整。 如果我们将所有值存储在数组中以备将来使用,则可以避免冗余工作。 每当再次调用该函数时,该函数将直接从备注数组返回结果。 func fib(_ n:Int)-> Int { var fibs:[Int] = [1,1] (2 … n).forEach {我在 fibs.append(fibs [i-1] + fibs [i-2]) } 返回fibs.last! […]

Swift 4.2中的委派模式

什么是协议? 根据 Apple文档 – 协议定义了适合特定任务或功能的方法 ,属性和其他要求的蓝图 。 然后,该协议可以由类,结构或枚举采用,以提供这些要求的实际实现。 满足协议要求的任何类型都被称为符合该协议。 除了指定必须符合标准的类型的要求之外,您还可以扩展协议以实现这些要求中的某些要求,或者实施符合标准的类型可以利用的其他功能。 在SwiftTable语言中开发UITableViewDelegate和UITableViewDataSource基本表视图时,您已经看到了很多次的协议 。 两种协议都有其自己的方法是必需的和可选的。 如果您已经在Apple的框架中看到过。 如果您按命令键( ⌘ )并单击鼠标左键,则在 UITableViewDataSource上 可以看到这些选项– 现在单击“跳转到定义”,您将看到他们的协议方法–

Swift后端的应用程序监视,首次更新

起始时间 自上次更新以来,发生了很多事情,我们想向您介绍我们的进展。 首先,让我告诉您更多有关我们的身份以及我们这样做的原因。 我和Alex五年前在SaaS产品上一起工作,并且在那时也成为好朋友。 Alex为生活设计产品时,我是一名软件开发人员。 在过去的几年中,我一直在为iOS开发,并在此之前使用Node.js和C ++。 我认为,无论使用哪种语言,开发人员工具都是日常工作中令人沮丧的一部分。 我希望您喜欢Xcode,但是……令人困惑的是,我们开发人员没有花足够的时间来使我们的工具更锋利,因为从长远来看,即使工具效率提高5%,也可以节省大量资金。 尽管创建了如此多的编程语言并发布了这些语言的库,但是整个开发过程仍然受到早期计算的启发,当时唯一的输入方法是文本。 看来,对其进行现代化的努力还不够集中和不够完善。 想出一个主意 当Swift宣布具有许多当时被认为是“学术性”语言的功能时,我对它印象深刻。 开源Swift使我们更接近成为全栈开发人员,并将其带入所有其他生态系统。 在那个时候,我围绕着开发人员工具研究自己的一些想法。 如果我们拥有GitHub,但对于iPad上的Swift Playgrounds,又能够轻松地在操场上共享代码,跟随其他人和他们在Swift上的经验,该怎么办? 如果您可以花最少的精力在云中运行Swift代码而不用担心服务器和可伸缩性怎么办? 所有这些都可能是个好主意,我很乐意看到有一天将它们付诸实践🙂 这使我对在Linux上运行具有很多潜在潜力的Swift产生了兴趣。 除了能够为多个平台编写代码之外,Swift本身在这个领域中处于有利地位,唯一可比较的语言是Rust和Go。 Swift在其生成的可执行代码中在可读性/简单性和CPU / RAM占用空间之间取得了良好的平衡。 这方面存在信息空白,我试图填补七月份发布的时事通讯。 订阅者的数量(每周增长5-10%)和内容量证明了我的假设。 非常感谢我们的读者以及所有为服务器端Swift生态系统做出贡献的人们,没有您,这个新闻通讯将无法实现! 这使我确信,可以在生态系统增长的早期阶段对开发人员工具产生最佳影响。 好像我找到了一个合适的人选。 从简单的事情开始是合理的,应用程序监视和检测似乎是一个不错的选择。 事实证明,对于Linux上的Swift,在这方面没有做太多事情。 亚历克斯喜欢这个主意,我们想证明确实有此需要。 验证想法 在将近一个月前启动了Astrocat的目标网页后,我们已经对这件事产生了浓厚的兴趣。 令我们惊讶的是,有多少人已经在生产中使用Swift,而提高后端稳定性和性能的工具将大有帮助。 我们看到了对崩溃报告和仪表工具的明确需求,并对未来产品有了清晰的愿景。 Astrocat的第一个版本将是一个集成在后端中的库,该库会将崩溃和错误报告发送到我们的服务器或本地托管的服务器。 基于这些事件,它通过电子邮件,Slack集成,推送通知等向您发送通知。