Tag: 编程

Swift有多快以及为什么(第3部分)

在第1部分中,我们知道在一个非常简单的情况下,Swift可能比Objective C快9倍。这是一个巨大的改进。 在第2部分中,我们知道可以在编译时优化C函数。 编译器可以将某些函数调用替换为值。 C ++具有称为模板元编程的能力。 但是对于大多数实际使用案例,Swift的速度与C相当。 现在,该看看Swift在复杂情况下是否可以保持其速度。 在这里,我们有一个Swift类Calculator ,一些类都继承自它,并稍微改变了add行为。 我知道“慷慨”并不意味着给出夸大的加法结果。 但是我什至不会使用那些新类。 因此,不会造成任何伤害。 和往常一样,Swift选择内联这些函数(即使add函数也被标记为重写。)但是这一次,由于有4种不同的add函数,Swift需要每次都找到正确的代码块来运行。 红线描述了执行流程。 因此,对于每个循环,CPU需要执行比较分支分支,因此速度较慢。 在这种情况下,我们很幸运。 由于我们正在使用Calculator.add ,因此它是第一个。 调用SuperGenerousCalculator.add需要更长的时间来执行,结果数据显示出这一点。 我们可以确定要调用哪个函数,因为我们知道它是同一对象,因此应始终调用Calculator.add 。 无需每次检查。 但是,尽管功能强大,但是Swift编译器有其局限性。 有一个称为面向协议的编程的新工具。 它促进使用protocol和struct 。 这也使某些事情变得简单,并避免了与类相关的性能损失。

iOS中的表视图—入门指南(第1部分)

不要害怕我! 我曾经以为创建一个简单的待办事项列表应用程序并不难,我的意思是它只是存储数据的一个表,对吗? 我打开了一本初学者的指南书,一脸茫然,编写一个待办事项列表应用程序本身就是一门艺术,需要深入了解对象之间如何进行通信(协议,委托等)。 如果您拥有iPhone,表视图几乎随处可见,它们都在您的联系人,音乐选择菜单,相册中,您可以为其命名。 因此,对于初学者来说,掌握这项技能非常重要,并且从中获得的所有知识都可以转移到其他类型的应用程序开发中 在本指南中,我将在最顶层讨论UITableView,然后逐步研究代码。 我相信您需要先了解整体情况才能驯服这头野兽。 模型-视图-控制器模型 天啊! 再没有关于MVC的另一篇文章! 但是,请允许我,您需要真正地掌握这种野兽之前,模型,视图和控制器层如何相互通信。 您会看到,MVC之所以成为如此杰出的软件体系结构模式的原因在于,它促进了代码的可重用性和关注点分离的概念。 像这样想,控制器是模型和视图之间的中间人。 您作为控制器的目标是在视图层中可视化地映射或表示模型,而视图层无需确认模型层。 本节的重要内容是控制器直接在视图和模型之间进行通信,您可以在此处的其他博客中了解有关MVC的更多信息。 UITableViewDatasource和UITableViewDelegate 当我刚开始时,我一直想知道类声明行中的内容到底是什么,但是它们是什么,为什么我们需要它以及它在做什么。 好了,为了解释这一点,我想先告诉你一个故事,这个故事将所有内容联系在一起并相信我,它将使事情变得更加清晰。 现在,让我们暂时忽略代码,在最后一节中将其全部介绍。 想想UITableView是一个被称为“ Tim”的人。 现在,蒂姆是个非常懒惰的人,他不喜欢做任何工作,他需要把一切交给他来完成工作,而这项工作是在列表,表格视图中显示数据。 值得庆幸的是,Tim有特殊的帮助,可以帮助您(控制器)了解并获得Tim完成工作所需的数据(符合UITableViewDatasource和UITableViewDelegate协议)。 数据源和委托专门处理不同的事物,它们的作用是赋予Tim功能,显示数据并与最终用户进行交互的作用。 蒂姆的助手 在继续之前,让我们讨论更多有关Tim的助手的信息,数据源负责向Tim报告有关数据的信息,这样的信息将需要显示多少项? 项目应如何显示? 应该有几节? 只是有关数据的所有内容,而没有别的。 因此,您实际上并不需要委托,因为如果您只想在表视图上显示信息,则只需要数据源。 但是,代表呢? 还记得数据源负责数据方面吗? 好的,委托负责管理用户的操作和表视图的“感觉”。 代表回答了一个问题:“如果用户触摸一行,该怎么办?”,“一旦显示数据,该怎么办?”它是一个帮助您向用户发出信号的用户,该用户对表视图进行了操作并使用协议中定义的方法。 带回来! 委托助手的作用实际上与MVC的基本结构息息相关,从而赋予了代理其生活目标。 您会看到,iOS中的视图(表视图是UIView的子类)应该并且应该仅显示数据,没有其他内容,显示期间。 但是,如果视图要回传给控制器怎么办? 为什么视图要这样做,您可能会问? 好吧,以您的iPhone上的设置菜单为例,这可以通过UITableView并且由于我们的助手UITableViewDatasource ,每一行UITableView正确填充(那里是舌头扭曲器)。 当您点击这些行时,它会通过告知您“用户已经点击了其中一个行,您想做什么?”而进入了另一个UITableView ,这要归功于UITableViewDelegate 。 要记住的一件事很重要,就是您知道协议中的所有这些方法? 您无需自己调用它们,只需简单地遵循它,系统便会在适当的时候调用它们,例如func tableView(UITableView, didSelectRowAt: IndexPath)当用户在列表中的某行上点击时,将调用func tableView(UITableView, didSelectRowAt: IndexPath)方法。表格视图。 同样,您不会调用协议方法,系统会调用。 结论 感谢您的阅读,希望您能从中学到一些东西。 […]

一个普通人的编码之旅

我决定着手#100DaysOfCode开始新的一年。 通过其他推文,我看到了许多雄心勃勃的目标(通常涉及找到开发人员职位)。 我的目标虽然没有那么崇高,但我想与其他像我一样悠闲地学习编码的人分享。 我没有任何近期的职业目标,但我确实认为知道如何编码将变得越来越有价值。 我衷心希望开发人员与用户之间的界线继续变得模糊,并且我相信我会找到方法将我从学习中学到的知识应用于日常工作中。 我的旅程开始了,因为我确定还有很多其他人。 我从Codeacademy开始工作,完成了一些挑战,被困住并离开了几年! 但是,嘿,没关系。 后来我遇到了FreeCodeCamp,并决定再次尝试编码。 事情几乎都以同样的方式进行,充满挫败感的时刻让我将其搁置很长时间。 对我来说起作用的是还有其他需要切换的地方。 我在iPad上启动了Swift游乐场。 我确定有人会觉得它很幼稚,但是在编码的背景下,我只是个婴儿。 我真的很喜欢这样的事实,当我的代码无法正常工作时,很容易逐步了解错误所在。 当然,现在我已经找到了其他语言可以做到这一点的工具和技巧,但是一开始内置此功能确实很有帮助。我还发现,在两种类型的教程之间进行切换可以帮助我思考不同方面的问题。角度。 总是有一些小怪癖没有得到明确的解释,但是当您以略有不同的方式看到相同的信息时,便可以建立更直观的联系。 每个人对学习哪种最佳语言都有不同的看法。 老实说,我想担心这些事情为时尚早。 但是有几个人向我赞扬了Python的优点,所以我想我会看一下。 我还想要Raspberry Pi,并记住它使用Python。 这使我参加了麻省理工学院的EdX课程, 《计算机科学入门和使用Python编程》 。 尽管他们强调这不是一门Python课程(而是一门使用Python演示核心原理的CS课程),但这似乎是一个不错的起点。 现在,事情真的开始融合了。 我见过for和while循环,并学会了迭代。 我知道if语句和布尔运算符。 了解如何以另一种语言使用这些技术并了解异同是非常有教育意义的。 我会说,由于在语言之间进行切换,我在语法上有些挣扎,但是最终这是一件好事,迫使我更加努力地记住正确的语法。 本周,我实现了几个重要的里程碑,使我成为了一个很好的#100DaysOfCode。 首先,我完成了FreeCodeCamp上的所有基本算法脚本挑战。 哇,我认为那将永远不会结束。 我迷失了绝望的放弃次数,但稍后会再次提出并找到解决方案。 我想我克服了对方法的恐惧。 从一开始,解决方案总是使用某种基本为您完成挑战的方法,而不是构建一些冗长的算法来逐步解决问题,这似乎一直是不公平的。 我也被吓倒了,因为我永远无法记住所有可用的方法,所以我只是不想使用它们。 而且,它们通常是一个黑匣子-很难确切地了解一种方法在特定情况下会做什么。 但是,不仅学会了通过测试,还学会了尝试一些不同的方法并使自己对使用方法更加满意。 我的另一个重要里程碑是在MIT课程的第3周结束时通过了问题集。 问题基本上是要开发一款像a子手一样的游戏。 老实说,我认为这将花费我几个小时,而且我想知道我是否学得足够好,足以应付如此艰巨的任务。 我最了解的是坚持。 我的第一次尝试没有效果? 当然不是,它几乎永远不会。 调整代码。 找出问题所在。 重新阅读一些笔记。 真的无法消除特定的错误吗? 破坏代码并采用其他方法-解决问题始终是一种以上的方法。 令我感到惊讶的是,我能够整理出一些实际上是交互性的代码,而最好的是没有办法作弊,这使我自己找到了解决方案,因此我为自己的全部代码而感到自豪自己的工作。 我议程上的下一件事是MIT课程的期中考试。 在完成之前,我将尽量避免使用其他语言。 这是有时间限制的考试,因此我不想浪费宝贵的时间试图记住我是否需要分号或逗号。 我真的不知道会发生什么,但希望一切顺利。 […]

iOS中的MQTT

为什么和如何 什么是MQTT? MQTT是一种轻量级协议,用于将消息从设备传输到客户端。 作为对MQTT的非常简短的描述,它通过具有充当中间人的MQTT代理来操作。 该代理管理一个或多个主题,这些主题是消息可能涉及的主题。 设备可以从那里将消息发布到某个主题,并且订阅该主题的所有连接的客户端都将收到该消息。 如果您以前从未使用过MQTT,则仅靠简要概述可能还不够,您可以在此处找到更详细的MQTT描述。 MQTT的用途 MQTT之所以出色,是因为它允许设备以相对较低的开销成本将数据发布到客户端,从而使其成为物联网设备的首选协议。 结果,您可能会发现自己想要在智能手机应用程序中实现MQTT,以允许移动访问此类IOT设备的数据。 当然,这可以应用于多种情况,但是在我的特殊情况下,我有一个传感器每秒大约发布一次读数。 我的目标是在我正在构建的应用程序中显示这些实时读数,因此本文将基于该特定应用程序,但当然仍可以应用于涉及iOS中MQTT的各种应用程序。 当然,它不仅可以显示原始消息,还可以进一步发展,并且您可以决定创建一个包含文本和图像的更加精致的界面,以更吸引人的方式解释和显示传入的MQTT消息。 您也可以根据需要决定使用实时MQTT数据发送通知,这将在以后的文章中进行介绍。 幸运的是,将MQTT数据的实时流传输到iOS应用程序上非常简单。 MQTT库 您将需要一个库才能将MQTT与iOS应用程序一起使用,因此我建议使用CocoaMQTT。 CocoaMQTT是“ pod”,这意味着它是使用CocoaPods进行管理和安装的。 通过第一个链接,您将找到设置和使用说明,但是在这里,我将显示必要的部分以使其变得更容易。 要使用CocoaMQTT,您将需要使用CocoaPods设置项目。 要做到这一点: 打开终端 cd进入项目的根文件夹 运行“ pod init” 这将创建一个名为“ Podfile”的文件。从此处开始,您需要编辑该“ podfile”以包含CocoaMQTT。 为此,请在您选择的编辑器中打开文件并添加以下内容: 豆荚’CocoaMQTT’ Podfile现在应如下所示: #取消注释下一行以定义项目的全局平台 #platform:ios,’9.0′ 目标’MQTTExample’做 #如果您不使用Swift并且不想使用动态框架,请注释下一行 use_frameworks! #MQTT的豆荚示例 豆荚’CocoaMQTT’ 结束 当然,目标名称可能会有所不同,具体取决于您为项目命名的名称。 从那里开始运行pod install ,CocoaPods将安装CocoaMQTT。 CocoaPods还将创建一个新文件“ MQTTExample.xcworkspace”,您现在必须使用它来代替xcodeproj文件。 打开该工作区,是时候添加CocoaMQTT了。 设置 要设置基本应用程序,只需在主故事板的中央放置一个标签,然后在视图控制器中创建一个插座即可。 到目前为止,您应该具有以下内容: 您可以在以后使界面更加精美,但这现在就可以了。 实施MQTT 现在,我们需要设置ViewController来建立MQTT连接并处理所有接收到的消息。 在此应用程序中,目标是在主视图的标签中显示任何收到的消息。 […]

SWIFTip#2:本周的随意见解

快速学习。 这是每周的见解,可增强Swift良好实践的技能。 如果您对快速学习者有更好的建议,请发表评论。 谢谢。 #SpeedupSwiftCompileTime 加快Swift编译时间 极大地优化您的Swift编译时间 hackernoon.com #CleanSwiftArchitecture 引入Clean Swift体系结构(VIP) 立即忘记MVC! hackernoon.com #invisible布局加载视图。 互动工作室/无风 Windless使实现不可见的布局加载视图变得容易。 github.com #SecurityAlertsOnGitHub GitHub现在会提醒您项目依赖项中的安全漏洞 如果您正在处理GitHub托管项目上的依赖项,那么您将很高兴知道回购平台将… thenextweb.com #SSLPinningSwift iOS中的SSL固定– Swift版 由于几乎整个iOS开发社区都已从Objective-C转移到Swift,因此,库的首选项和 infinum.co #Reusability&CompositionSwift Swift中的可重用性和组合* Swift Post 尼采,梭罗和黑森最有可能试图逃避他们一生的一个概念:依赖性。 即使是…… theswiftpost.co

Swift提供了一组内置数据类型,这些数据类型是字符串,整数,浮点数…

Swift提供了一组内置数据类型,这些数据类型是字符串,整数,浮点数和布尔值。 在大多数编程语言中也可以找到这些数据类型。 在本文中,我们将详细讨论每种数据类型。 串 我们将介绍的第一个数据类型是字符串。 一系列字符代表一个字符串。 字符串用于在应用程序中显示文本。 用引号引起来的字符串称为字符串文字。 在编程中,我们不能只向Playgrounds添加文本。 因此,要编写字符串,我们必须将字符串用引号引起来。 让我们在Playgrounds中添加一个用引号引起来的名称: 在“操场”中,您的值将显示在“结果面板”中。 整数数据类型 整数 ( Ints )是整数(32和-100)。 当您需要执行计算(即加,减,乘等)时,整数很有用。 让我们向Playgrounds添加一些数字。 在下一行中,以您的名字键入32,然后在下一行中键入-100,如以下屏幕快照所示: 同样,您在名称下的结果面板中看到32和-100。 浮点数字 浮点数是具有小数部分的数字,例如4.993、0.5和-234.99。 让我们也将这些值添加到Playgrounds中: 布尔值 布尔值 ( bool )被称为逻辑值,因为它们可以是true或false。 当您需要确定某些逻辑是对还是错时,请使用布尔值。 例如,用户是否登录? 该声明将为true(是),或者为false(否)。 因此,在Playgrounds中,添加true和false: 现在,我们已经介绍了Swift中的所有主要数据类型。 目前,我们无法使用这些数据类型。 使用数据是变量和常量起作用的地方。 变量和常量—存放数据的位置 变量和常量就像包含任何数据的容器。 当要声明变量时,必须使用var关键字。 让我们声明我们之前做过的每种数据类型,但是这次使用变量和常量代替。 用字符串创建变量 首先,删除您已经在Playgrounds中输入的内容。 让我们声明第一个变量,名为fullName,并将其设置为您的名字: var fullName = “Craig Clayton” 前面的代码说我们有一个名为fullName的变量,并且它拥有Craig Clayton的字符串值。 您的结果面板会显示您的真实姓名作为其数据: 创建一个带有整数(int)的变量 现在,通过添加以下内容,创建一个名为age的int变量并将其设置为您的年龄(或您希望的年龄)。 年龄= 40 […]

iOS 11:DeviceCheck API

快速说明-我将来所有的帖子都将发布在我的专用网站上,并且此出版物不再更新。 谢谢阅读! 每个WWDC,总是会有晦涩的API进入每年的新玩具“单词泡沫”幻灯片,供开发人员使用。 微弱地坐在那里,这是有理由的,苹果公司认为它是有用的补充,只有少数几个会使用,而不会很多。 DeviceCheck适合该帐单,然后再适用。 您可能会认为Cupertino&Friends ™的必要性,他们不得不做出或面对这样一个现实,即工程师会找到另一种方法来处理X或Y,从而导致可耻的目的。 因为开发人员不会像以往那样做任何可疑的事情。 因此,DeviceCheck有点像大多数开发人员出于完全正当的商业原因想要做某事时发生的事情,但是实际上并没有任何好的方法。 这是一个奇怪的小API,这是我们本周讨论的主题。 那么,这是什么? TL; DR仅此而已:这是Apple认可的有保证的方式,可以在保持绝对用户隐私的同时,将您的应用标识为在有效的Apple设备上运行。 我想那不是新闻中最有趣的。 这里真正的讨论在于事物的为什么部分。 在这种情况下,频谱的使用范围可能包括从切换某个设备上的促销优惠,将购买链接到帐户或为欺诈活动审核设备。 例如,会议室中谁在此使用两个不同的用户名或个人资料来扩展某种免费试用? … ….. …….. ♂‍♂️ 就是这样 我们只是在帮助一个人,特别是为任何给定的iOS(或tvOS)设备关联某个给定的状态。 为了使您的创意源源不断,请考虑已发布了两个应用程序。 如果他们打开App One,则可以将设备分配为状态01;当他们打开App Two时,您可以查询状态,因为状态将以相同的方式保留,然后解锁一些内容,折扣或奖励。 它是与应用程序无关的API,因此在场合需要时可以充分利用它。 但是,也请注意,这是否会对您构成设计约束。 再说一次,我们谈论的是每个设备两位,而不是每个应用程序两位。 那么它是怎样工作的? API 我一直很欣赏“直截了当”的API类型,而这正是我们所能获得的。 该设置允许开发人员为每台设备存储两位信息(以及时间戳)。 因此,与其偷窥苹果希望让您闭门识别设备的几扇门,您还可以拿回一点点并完成该操作: 让curDevice = DCDevice.currentif curDevice.isSupported { curDevice.generateToken(completionHandler:{(数据,错误)在 如果让tokenData =数据 { print(“接收到的令牌\(tokenData)”) } 其他 { 打印(“命中错误:\(错误!.localizedDescription)”) } }) } 请注意,模拟器不会通过isSupported,因此,如果您要对其进行测试,我想无论如何都要做我们应该做的事情,并使用真实的东西📱。 有了该代码,您就可以进行以下操作: 00 […]

Swift中的泛型…

泛型或泛型编程是swift的强大功能之一,它使我们能够编写灵活且可重用的函数和类型,例如( Classs,Structs,enums )仍保持类型安全。 快速地,我们使用数组,字典和可选类型的类型是泛型类型。 泛型在声明时需要类型参数。 当创建Generic类型的实例时,我们为type参数指定实际类型,以使实例成为具体类型,从而提供Type-Safety。 感谢Swift的Type-Safety和Type推断,这使Generics的工作变得非常容易。 DRY原理是通过在我们的代码中适合的任何位置使用泛型来实现的。 您可以编写避免重复的代码,并以清晰抽象的方式表达其意图。 注意:mutating关键字用于更改结构或枚举的自身属性。 如果有任何func试图更改其自己的类型属性,我们需要在func定义之前使用mutating关键字。 在上图中,在定义扩展名时,我们没有为正在扩展的类型设置类型。 无需再次指定扩展类型。 我们可以使用类类型以及上面示例中使用结构的方式。 具有通用约束: 有了约束,我们可以通过允许我们要使用的类型来限制可访问性。 如果尝试传递不满足约束的值,则会出现以下错误。 在下面的示例中,我们限制了where子句,因此我们可以实现更严格的类型安全性… 我们可以通过指定related -type,在协议中使用通用类型,如下所示。 我们可以通过将关联类型限制为必需或允许的类型来进一步限制关联类型。

第32周Swift故事

我对得到的积极回应感到惊讶。 人们只是喜欢为Swift社区做出贡献。 这就是为什么这封信献给本周加入Swift2Go的所有新作家的原因。 鲍勃·罗布林 马丹·阿布拉瓦内尔(Matan Abravanel) 乔吉·古纳万(Giorgy Gunawan) 詹姆斯·马利森 布鲁诺·穆尼兹(Bruno Muniz) 阿林德·阿留(Arlind Aliu) 阿尔菲安·洛萨里(Alfian Losari) 亚尔辛·奥兹迈德(Yalcin Ozdemir) 莫滕·贝克·迪特列夫森 请为这些出色的作家提供一本书,以感谢他们对Swift2Go出版物的贡献。 您可以通过与社交媒体上的朋友共享出版物或其中的故事来直接帮助发展该社区。 🚀

在Swift中从回调到异步/等待

自从我写了一篇博客文章已经有一段时间了(实际上,这是我的第一篇文章,我没有任何借口!),但是我真的很想接触Swift中的异步编程。 您在Swift中编写的大多数代码至少必须在某种程度上考虑异步性。 在经过一些通常不属于控制器层的计算后更新ui时,即使如此,您也必须考虑这段代码的正确位置。 在除主线程之外的其他线程上更新UI是一个常见错误,可能会导致错过UI更新,视觉缺陷,数据损坏和崩溃。 当初学者从iOS开始时,他们会在其他进程完成后使用回调执行某些功能。 通常,如果需要,在操作完成后执行的功能链的最后一部分将是更新UI。 假设是这种情况,使用回调我们将必须在整个回调链中反复传递“ Update the UI”回调,直到到达链的末尾,最后调用该回调来更新UI,假设我们不想通过调用UI来污染我们的域/基础架构逻辑,因为我们重视关注分离。 让我们看一下一段代码如何从简单的回调演变为使用异步/等待,从而使您可以在后台线程中编写完全阻塞的代码,而每次只需编写几行额外的样板代码。 这与我刚开始使用Swift时编写的混乱非常接近。 我们的用例:我们正在构建一个应用程序,该应用程序将首先发出HTTP请求以检索一些json。 此json中是我们要下载的图像的URL。 最后,下载完该图像后,我们应该将其呈现给用户并在UI中显示。 让我们首先使用回调来构建它。 第一步是使用Data(contentsOf:)下载一些json,该json只是向端点执行GET请求,而没有任何标头或其他信息。 实际上,这是执行下载的最差方法。 Data(contentsOf:)应该仅用于本地文件,但是出于本博客文章的目的,假定绝对没有故意进行错误检查。 Grand Central Dispatch,简称GCD,提供了一个简单而强大的API,通过它我们可以在单独的线程中执行“后台”操作。 首先,让我们创建一个接受String并返回UIImage闭包。 然后,我们可以将其传递给对JsonDownloader的调用。 首先让我们看一下入口点,即ViewController 。 为了使这项工作涉及承诺,我们还需要做其他事情,但是目前,这是顶层代码。 我已经使用PromiseKit和AwaitKit已有几个月了,从编写带有回调的异步代码到此方法的变化令人震惊-它们使我的开发变得更加轻松和有趣! 我希望这篇文章能说服一些人看一下async / await,并将其从回调地狱更改为看起来更简洁易用的东西。 在下面的评论中让我知道,如果您当前的代码库中有回调地狱,是否正在考虑将其检查出来,或者是否有其他替代方法在更复杂的代码库中也能正常工作! 最初于 2018 年8月8日 发布在 blog.j7mbo.com 上。