Tag: swift

Redux —我如何理解?

初次见到Redux时,乍一看似乎有些令人不知所措。 但是,如果您想有效地使用Redux,则必须了解它的工作原理以及其核心要素。 状态…动作…减速器…存储…在今天的帖子中,我想向您介绍Redux,以便您可以了解其工作原理。 什么是Redux? 如果您完全不熟悉Redux,则可能需要先检查Redux文档。 Redux是JavaScript应用程序的可预测状态容器。 它可以帮助您编写性能一致,在不同环境(客户端,服务器和本机)中运行且易于测试的应用程序。 最重要的是,它提供了出色的开发人员体验,例如实时代码编辑和时间旅行调试器的结合。 请记住,您无需成为Web开发人员即可在您的应用程序中使用类似Redux的架构。 在各种平台上都有很多这样的想法,ReSwift就是其中之一。 档案(州) 如果我问您,应用程序中的状态是什么样的,那么很难立即解释它。 一些值存储在视图模型中,有些存储库也存储一些值……哦! 那里的类​​知道当前正在登录的用户。但是,如果在这样的问题之后我们可以立即显示应用程序的状态呢? 对我们来说,以这种方式订购的应用程序难道不是很容易吗? 在这种情况下,Redux会为我们提供解决方案。 想象一下,您的状态就像存档,您完全知道在哪里寻找事物,并将其存储在一个结构中。 当然,具有较大的结构并不表示将是一团糟。 您可以将状态存储在归档抽屉中,这些抽屉将代表登录屏幕,设置屏幕等的状态。 字母(动作) 所以……现在我们的档案中有一个整齐的结构化状态,所有内容都很干净,并且易于推理。 但是,正如您可能期望的那样,我们的用户很有可能希望以某种方式更改此状态(我想这并不是什么新鲜事物)。 我们该如何处理? 好吧,我们不能直接访问我们的应用程序状态并更改我们想要的内容。 那不是您使用干净存档的方式……让我们想象一下我想更改我的地址。 我不能只是走进市政厅去玩他们的档案。 我需要写一个正式的字母。 标题:约翰·多伊(John Doe)—地址更改 您好,我刚搬到另一所房子。 我目前的地址是Art Street 10。 不用担心,当我们更改应用程序的状态时,我们只需要关键信息。 因此可能看起来像这样: 但是,有时我们无法立即准备此类信件,因为我们还没有所有必需的数据。 当我需要执行http请求时,我还不知道响应。 对于这种情况,我们必须聘请会计师。 他们将完成所有工作,然后代表我们发送一封信。 例如,在收到服务器的响应后,他们将在信中填写所需的信息并将其发送给我们。 信准备好后,您必须将其发送到市政厅。 有很多人在这里工作,照顾各种事情。 有些人处理您的地址信息,有些人处理您的汽车登记等……他们用您来信中的数据更新档案后,他们会通知您,以便您例如可以更新待办事项列表并划掉“更改地址” …或更新您的Facebook状态。 应用程序内部的reducers也是如此。 如果创建了新状态,则将通知所有对此更新感兴趣的地方。 市政厅员工(减速机) 正如我说的那样,在市政厅里,有很多人在照顾各种事情。 这些是我们应用中的减速器。 想象一下,在收到我们的信之后,该信将交给cityHallDirector,后者将其呈现给该市政厅中的每个工人。 他们中的一些人会看一下它,而只是忽略它,因为他们看到他们不熟悉该标题。 但是到某个时候,会有人说:“哦! 我负责地址更改,我必须处理!”。 请记住,要求市政厅工作人员进行任何更改的唯一方法是给他们这样的信件。 “……”是点差运算符。 […]

Swift Package Manager基础

请注意,每个依赖项也可以具有自己的依赖项。 因此,如果您包含“ Perfect-HTTPServer”库,则它包含“ Perfect-HTTP”,其中包含“ PerfectLib”,因此无需在您自己的Package.swift文件中包含PerfectLib。 模块布局 关于在何处以及如何创建模块的规则很少。 您的所有源代码都可以在一个文件中,也可以在多个文件中。 但是,所有这些文件都必须位于Sources目录中。 请注意,如果您希望在Sources目录中有子目录,则该Sources目录中必须有一个与Package.swift中的包名称相对应的“父”目录。 例如,Perfect App Template在Sources中有一个名为“ Perfect-App-Template”的目录,该目录与Package.swift文件中的软件包名称相对应。 语义版本控制 SPM假定依赖项存储库遵循“语义版本控制”命名。 这意味着每个标签由3个组件组成,每个组件都是整数:“主要”版本,“次要”版本和“补丁”。 一般规则是,当中断和更改不兼容的API时,将增加主要版本。 引入应该向后兼容的功能时,次要版本会逐渐增加,而补丁版本则用于错误修复或改进。 例如: “ 1.2.4”表示此库的主要版本为1,次要版本为2,补丁程序级别为4。 为SPM合并语义版本控制 在Packages.swift文件中,我们看到每个软件包都具有关联的“ majorVersion”属性。 这意味着当执行初始构建(或先清理然后再构建)时,该过程将在该主要行中获取该程序包的最高标记版本。 例如: .Package(URL:“ https://github.com/PerfectlySoft/Perfect-HTTPServer.git”,majorVersion:2) 将获取主要版本2中的最高版本,当前版本为2.1.15 如果存在3.xx版本,将被忽略,仅将获取2.xx版本。 相反,如果我们需要2.0.x版本,则可以指定: .Package(网址:“ https://github.com/PerfectlySoft/Perfect-HTTPServer.git”,majorVersion:2,minorVersion:0) 这将获取2.0.x行中的最高补丁程序级别。 添加或删除依赖关系 对Packages.swift文件进行任何更改后,我强烈建议您做两件事:清理和构建,以及Xcode项目文件的重新生成。 清理和重建: #迅速3.0.2 迅速建立–clean = dist; 快速构建 #迅捷3.1 快速软件包更新; 快速构建 要重新生成Xcode项目: 迅捷包generate-xcodeproj 专家提示:使用Perfect Assistant 尽管可以使用命令行和手动编辑文件来实现所有这些功能,但使用Perfect Assistant实际上更容易。 甚至那些认为自己是服务器端Swift超级用户的用户都默认使用PA(完美助手),因为它可以更快,更容易地拖放,按下几个快速按钮。 在PA中添加依赖项就像将依赖项拖放到项目的“ Selected […]

Swift的最佳图像下载,处理和缓存库

大家好! 我想介绍一下我最新的下载,处理和缓存管理器库选择。 更新:2017年12月1日。 PINRemoteImage PINRemoteImageManager使用下载和处理任务的概念来确保即使多次调用下载或处理图像,也只会发生一次 安装 使用CocoaPods将PINRemoteImageManager添加到您的项目中。 只需将以下行添加到您的Podfile中即可。 pod’PINRemoteImage’,’〜> 3.0.0-beta’ 然后运行: pod install SDWebImage 该库提供了具有缓存支持的异步图像下载器。 UI元素有类别,例如UIImageView , UIButton , MKAnnotationView 。 安装 使用CocoaPods将SDWebImage添加到您的项目。 只需将以下行添加到您的Podfile中即可。 pod ‘SDWebImage’, ‘~> 4.0’ 莫阿 Moa是使用Swift编写的图像下载库。 通过设置其moa.url属性,它允许下载图像并在图像视图中显示图像。 安装 使用CocoaPods将Moa添加到您的项目中。 只需将以下行添加到您的Podfile中即可。 pod ‘moa’, ‘~> 8.0’ 然后运行: pod install 文森特 一个小型图书馆,可以轻松下载和显示远程图像。 安装 使用CocoaPods将Vincent添加到您的项目中。 只需将以下行添加到您的Podfile中即可。 pod ‘Vincent’, ‘~> 1.5.4’ 然后运行: pod install 翠鸟 Kingfisher是一个轻量级的纯Swift库,用于从Web下载和缓存图像。 […]

迅速滚动滑块

UIScrollView的自定义滚动滑块。 安装 CocoaPods: 吊舱“ SwiftlyScrollSlider” 手册: 只需将SwiftlyScrollSlider.swift复制到您的项目中即可。 使用 使用真的很简单。 请为故事板或XIB中的滚动滑块创建例如UITextView和UIView ,并为此UIView设置一个SwiftlyScrollSlider类。 并且UITextView的委托应该是SwiftlyScrollSlider 。 就这样。 定制示例: scrollSlider.thumbImageView?.image = UIImage(named:“ ScrollSliderCustom.png”)//更改滚动滑块的图像 scrollSlider.lineBackgroundView?.backgroundColor = UIColor.yellowColor()//线条的颜色 scrollSlider.lineBackgroundView?.layer.borderColor = UIColor.yellowColor()。CGColor //线条颜色的渐变 您可以在此存储库中轻松找到示例。

如果纹波破坏SWIFT,价格对XRP的影响

比您想象的要少得多。 Ripple的成功与XRP的价值只是松散的联系。 如果Ripple取代SWIFT并增加其交易量,那么5万亿中只有一小部分涉及XRP。 和 鉴于XRP的持有期有限且交易频繁,它可能无法从其参与的交易中获得太多价值。 XRP是用于Ripple网络的工具,可促进流动性差的货币对之间的转移。 想想有两个机构通过网络进行协调,以将肯尼亚先令换成冰岛克朗。 不必直接匹配这对。 XRP允许双方转换为XRP并以此方式进行交换。 因此,通过Ripple网络流动的绝大多数交易都不会涉及XRP。 SWIFT网络中涉及交易的前4种货币类型: 美元 欧元 日元 磅 代表几乎90%的活动。 为了便于分析,我们将慷慨地假设其他10%的用户将使用XRP。 请注意,这不太可能,因为人民币,加元和北欧国家的货币交易可能不需要使用XRP进行结算。 因此,这将是预期使用量的最高端…… 这使得涉及XRP的日交易量达到5000亿美元。 5,000亿美元的交易量仍然很大,因此XRP仍有很多上涨空间,对吗? 可能不会。 在Ripple网络上交易的机构不太可能希望持有XRP。 快速卸载它,以换取客户更常用的货币。 高速货币仅实现其交易量价值的一小部分。 因此,与美元相比,美元约占Swift交易量的50%,或每天约2.5万亿美元。 每交易一美元,它的价值将大大降低,因为它将以更高的速度交易。 保守地讲,我估计它的速度是美元的10倍。 交易货币价值的合理代表是每日交易量/速度。 因此,5,000亿美元/ 10等于500亿美元。 和 该数字反映了增加的体积值的上限,因为保守起见,我将其最大化而将速度最小化。 因此,根据截至(3/26/2018)的39,094,227,299的循环供应,瑞波币取代SWIFT网络对XRP值的贡献约为每XRP 12.5美分。 谢谢阅读 订阅我的时事通讯,以了解我最新的加密资产研究最新动态!

克隆中型iOS应用程序-第2部分

注意:自从我开始撰写本系列文章以来,Medium已使用名为“ Stories”的新功能更新了其应用。 本系列基于以前的版本,该版本具有非常相似的UI。 更改ViewController的背景色 在处理导航栏之前,让我们更改视图的背景。 我们可以在ViewController.swift中通过更改view.backgroundColor属性来实现。 通过在Medium应用程序上使用方便的吸管工具,我们看到背景色应对应于(249,249,249)的RGB。 Swift中内置的UIColor构造函数使我们以一种不直观的方式创建颜色,但是幸运的是LBTAComponents库使用更好的构造函数扩展了UIColor类。 因此,在将库导入文件后,我们可以添加viewDidLoad方法 view.backgroundColor = UIColor(r:249,g:249,b:249) 如果您现在运行该应用程序,我们现在将具有与真实应用程序相匹配的灰白色背景! 自定义导航栏 现在该处理导航栏了。 为了提高代码的可读性和结构性,我们将使用一个名为setupNavigationBar的新方法来封装本节中的所有代码,该方法将在viewDidLoad中调用。 我们可以先处理背景色,恰好是纯白色 navigationController?.navigationBar.backgroundColor = .white 如果运行该应用程序,您会发现颜色有些不对劲。 这实际上是因为默认情况下,该条设置为半透明。 我们可以简单地改变它 navigationController?.navigationBar.isTranslucent = false 现在背景看起来正确了。 现在,我们将“中”徽标放置在中间。 我在Github存储库中包含了徽标的切口。 让titleImageView = UIImageView(image:UIImage(named:“ medium_logo”)) titleImageView.frame = CGRect(x:0,y:0,宽度:34,高度:34) titleImageView.contentMode = .scaleAspectFit navigationItem.titleView = titleImageView 我们首先使用Medium徽标(位于资产文件夹中)创建一个UIImageView。 然后,我们通过首先将封装视图的框架设置为所需的大小,然后告诉图像缩放以适合该框架(通过.contentMode属性),来设置我们希望图像的大小。 最后,我们将titleView(已居中)设置为我们的自定义视图。 现在,让我们在右上角添加搜索按钮。 我们可以使用几乎所有的精确技术,而是创建一个自定义按钮并将其设置为导航栏的rightBarButtonItem。 让searchButton = UIButton(type:.system) searchButton.setImage(UIImage(name:“ search”)?. withRenderingMode(.alwaysOriginal),用于:.normal) searchButton.frame = […]

Server Side Swift入门:1.2

StORM简介 欢迎来到我的“ Server Side Swift入门”系列的第三部分。 在整个系列文章中,我将解释如何使用Perfect工具箱使用Server Side Siwft的各个不同方面进行入门和运行的基础知识。 今天,我将介绍Swift ORM“ StORM”,它旨在与Perfect及其数据库连接器一起使用。 我将介绍如何设置一个与StORM一起使用的类,以及读取,写入和删除数据的基础知识。 首先,让我们看看什么是ORM。 ORM代表对象关系映射,它是一种方法,旨在提供快速代码中的对象与数据库条目之间的链接。 这意味着您可以在代码中创建和填充对象,然后调用“保存”命令,它将保存记录-如果记录已经存在,则对其进行更新,否则将创建一个新记录。 相反,您还可以指示ORM从数据库中获取特定行,它将填充对象,或者如果多行符合您的查找条件,则返回有序对象数组。 最后,ORM将帮助您删除条目。 所有这些都无需创建所有连接,处理所有数据库打开/关闭操作以及处理数据库操作通常需要的所有其他详细代码。 这些都覆盖在ORM中,因此您不必这样做。 但是,ORM的真正魅力在于另外两个概念: 如果您使用的是SQL数据库,则无需了解SQL即可完成所有这些操作。 其次,从一个数据库到另一个数据库的基本操作和语法应该完全相同。 “获取”操作与您使用MySQL一样,与MongoDB相同。 与“保存”或“删除”相同。 今天,我们将使用SQLite StORM来研究Perfect中的ORM操作。 如前所述,所有这些操作对于其他StORM变体几乎都是相同的:MySQL,Postgres,CouchDB和MongoDB。 首先,让我们在Perfect Assistant中创建一个新项目。 我们将创建一个“空可执行项目”,并将其命名为“ StORMDemo” 现在,它现在完全没有依赖项-让我们添加SQLiteStorm依赖项…,然后按“保存更改”。 立即它将开始获取所有需要的文件,并将重新创建Xcode项目。 完成后,单击“打开:Xcode项目”按钮。 打开main.swift,默认为print hello world语句。 在运行之前,我们需要选择可执行的目标方案,而在执行该方案时,我们将设置项目工作目录,稍后将需要它。 运行此命令,我们看到“ Hello,World!”已在控制台视图中打印出来,然后该程序存在。 与一直运行直到关闭的Web服务器可执行文件不同,此可执行文件是简单的运行和退出。 这个“ Hello,World!”不是我们想要的—第一步是定义数据库配置。 对于SQLite,我们只需要设置一件事-数据库名称和位置。 对于其他用户,您必须设置IP地址,端口,用户名和密码等参数,但是使用SQLite作为教学工具要容易得多。 首先,我们需要添加到main.swift文件中: 导入SQLiteStORM 进口StORM SQLiteConnector.db =“ ./stormdemo” 这告诉ORM该文件的位置和名称在我们工作目录的表面,因此将其称为“ stormdemo” 我们需要做的下一件事是添加一个类,为其提供一些属性,并将其连接起来以供ORM使用。 为我们的课程Monster.swift创建一个新文件 […]

我一个月内在Github上获得800颗以上星星的方法

本文是根据我发布iOS开源库Sharaku的经验编写的。 这个图书馆一个月内获得了800颗以上的星标。 我没想到这会成为如此受欢迎的项目。 我的期望是在6个月内获得50颗星。starting开始之前,我想确保这就是我在这次体验中的感受,这就是有关轻量级图书馆的故事。 这是我所做的一些步骤。 1.提出想法 首先,我们需要对将作为开放源代码创建一个想法。 我想我们想使图书馆受欢迎。 我们应该提出什么样的想法? 我想我需要在开始编程之前问一些问题。 完成需要多长时间? 我想您有自己的工作,并且不能花这么长时间来从事开源项目。 如果答案不够短。 简化想法可能更好。 对我来说,我可以花的时间只有1或2天。 它有其独特的价值吗? 没有自己价值的图书馆将不会流行。 因此,您需要考虑其他类似库之间的区别。 这就像在思考商业模式。 如果您认为自己的想法满足上述条件,那就开始编程吧! 2.程式设计 对于Sharaku这样的库,简单性很重要。 使用Sharaku,您可以将功能与如下几行代码结合使用。 让vc = SHViewController(image:imageToBeFiltered) vc.delegate =自我 self.present(vc,动画:true,完成:无) 由于我使用了CocoaPods模板,因此它为我提供了直接的文件结构。 这将有助于其他开发人员的维护或贡献。 3.释放 今天,为开发人员共享源代码的唯一方法是Github。 我认为以下两点对于这一步骤很重要。 设计 对于某些开发人员来说,他们不是擅长使用Adobe Illustrator或Sketch.app进行设计。 但是设计对于在Github上吸引明星非常重要,因为共享和传播您的图书馆的人将使用粘贴在Github上的图像或视频。 因此,您需要仔细制作它们。 自述文件 即使您的设计很棒并且库本身很棒,但是如果存储库的README质量很差,人们如何依赖您的库并使用它。 自述文件应涵盖开源库的最低要求。 用法 示例(屏幕截图或视频) 依赖关系和要求 如何安装 执照 4.传播 首先,我使用Facebook和Twitter,因为我的许多朋友都是开发人员。 其次,列出库的Web服务。 就我而言,这是可可粉控件或iOS Cookies。 最后一个Github存储库正在收集有前途的开源库。 在我的情况下,Sharaku被列为超赞。 通过上述渠道在Github上获得超过20或30颗星之后。 […]

开始Swift编程第5部分-函数,枚举和作用域

在上一篇文章中,我们介绍了if语句,while循环和for-in循环(通常仅称为for循环)。 开始进行Swift编程第4部分-决策和循环 在上一篇文章中,我们介绍了运算符,可选值和nil值。 medium.com 其中一些if语句非常大,如果我们想在该if语句中做多个事情怎么办? 它们将变得庞大且难以阅读。 这就是今天的全部。 让我们潜入。 功能 实际上,您可以在Swift中编写任何功能的程序。 我敢肯定,来自其他语言的人们正在思考,哦,是的! 事实是您真的不知道。 我们将在作用域部分中对此进行更多讨论,但是在全局范围内编写的代码将用作程序的入口点 。 入口点只是一种说法,这是程序启动时首先运行的代码。 很容易,对吧? 我们编写函数是因为它破坏了我们的代码,使其更易于阅读。 我们可以遵循一些编程原则,这些原则实际上只是为了使您的工作更轻松的准则,虽然列表并不详尽,但是足以让您思考如何使代码变得更好: 关注点分离 —如果您对字符串中的字母进行计数然后将两个数字相加,则可以采用这两个单独的函数,一个函数对字符串中的字母进行计数,另一个函数对数字进行累加。 单一责任原则 -概括为以下短语:每件事都有一份工作,每件事都做得很好。 不要重复自己(DRY) -这很明显,为什么要多次输入相同的文本? 为什么要多次输入相同的文本? 这让您发疯,知道我曾经做过,如果您是A型性格,但是当A型开发人员看到一遍又一遍写相同的东西时,他们就会发疯,这是个坏消息,几乎每个阅读您的代码的开发人员都在使用当他们这样做时,请输入心态。 你明白了吗? 好! 我们将在以后再讲更多,但是现在,这是一个很好的基础。 让我们开始向您展示一个用Swift编写的函数的示例。 语法可能看起来很奇怪,但我们将介绍所有内容。 我知道这乍看起来可能会令人困惑,但让我们来看一下。 首先,我们使用func关键字定义一个函数。 这让编译器知道,嘿,我希望下一个代码块可重复使用。 接下来,我们给函数命名为addTwoNumbers 。 函数名称后带有括号,如果没有参数,则将其保留为空: func doStuff() { /* doing stuff */ } 如果有参数(可以传递给函数的东西),则将它们包括在声明中。 在上面的示例中,我们确实有参数,确切地说是两个,我们有number和otherNumber 。 这些在示例中不是很具描述性,但应该是 。 您可能会注意到,我使用了number firstNumber和otherNumber secondNumber 。 number和otherNumber是我们在以后的调用中将引用这些参数的内容,因此我们知道我们要为哪个参数设置值。 […]

Swift中值类型和引用类型之间的区别

介绍: 因此,对于每个新手迅速的程序员来说,了解值类型和引用类型之间的主要区别很重要。 在本文中,我们将讨论有关值类型和引用类型的主要区别。应选择的示例以及定义的时间。 在深入研究之前,我们需要了解一些基本定义,例如.. 类型:类型是数据的分类,告诉编译器或解释器如何使用数据。 有一些Swift基本类型: Int, Float ,Double,Bool,String,Array 定义: 值类型 :值类型是直接在内存上创建的类型。每个实例保留唯一的数据副本。在分配或复制时,它会创建一个完整的新数据。 引用类型 :共享单个数据的类型。 初始化一次并分配给变量,触点或函数后,其返回引用。 示例照片: 让我们用类做一些代码: 现在,如果我们将dadCar的值更改为将发生的事情,那么这就是主要问题! 为什么要改变妈妈的颜色: 当我们通过分配momCar实例使dadCor常量时,它仅返回对dadCar的引用,而未创建momCar的完整新副本。由于swift类是引用类型,因此仍引用单个实例。 像这样 : 还要注意的另一件事是dadCar是常量(let),但是我们可以为其分配值,因为引用类型实例是可变的。我们正在为dadCar分配值,并且正在更改其引用的值而不是本身。默认情况下,引用为nil。 与Struct相同的代码: 主要区别: 值类型和引用类型之间的主要区别在于,值类型复制数据,而引用类型共享其数据的单个副本。当我们创建具有值类型的实例时,值类型的均值不变,它创建数据的唯一副本,并且它可以t可以更改,但引用类型是可变的,其值可以更改.. 使用值类型时: 将实例数据与==进行比较很有意义 您希望副本具有独立状态 数据将在多个线程的代码中使用。因此,您不必担心数据会从另一个线程更改。 使用引用类型时: 将实例身份与===进行比较比较有意义 您要创建共享的可变状态 如何存储在内存中: 在普通类型系统中: 1.Value Type —获取存储在堆栈存储器中。 2 。 引用类型 —获取存储在托管堆内存中 使用值类型的优点: 1.效率 引用类型实例是在堆上分配的,这比堆栈分配要贵。 为了确保在不再需要引用类型实例时释放已分配的内存,需要保留对每个引用类型实例的所有活动引用的计数,并在没有更多引用引用时对其进行释放。 值类型不受此开销的影响,从而可以有效地创建和复制实例。 值类型的副本被认为是便宜的,因为值类型实例可以在恒定时间内被复制。 Swift将内置的可扩展数据结构(例如String,Array,Dictionary等)实现为值类型。 但是,由于它们的大小在编译时未知,因此无法在堆栈上分配它们。 为了能够有效地使用堆分配并维护值语义,Swift使用了一种称为copy-on-write的优化技术。 这意味着,虽然每个复制的实例在逻辑上都是一个副本,但是仅当复制的实例发生突变时才在堆上进行实际复制。 在此之前,所有逻辑副本将继续指向同一基础实例。 这提供了更好的性能特征,因为制作的副本较少,并且在进行复制时,它涉及固定数量的引用计数操作。 如果需要,此性能优化还可用于自定义值类型。 […]