Tag: 编程

SWIFTip#1:本周的随意见解

快速学习。 这是每周的见解,可增强Swift良好实践的技能。 如果您对快速学习者有更好的建议,请发表评论。 谢谢。 #常量 Swift中的命名空间— Cocoacasts 为了避免与其他库和框架发生命名冲突,Objective-C类需要具有唯一的名称。 那… cocoacasts.com 在Swift中使用全局常量的乐趣 摆脱该常数struct medium.com #CodeDiscipline&清洁度 领域/ SwiftLint SwiftLint —一种用于实施Swift样式和约定的工具。 github.com #JSON到SwiftModelsGenerator JSON到Swift,TypeScript,Go,C#,Java等::: quicktype 给定示例JSON,quicktype输出类型和序列化器,以便在Swift,Go中快速读取和写入该数据… quicktype.io json4swift.com | 在线JSON到Swift模型生成器 在这个技术时代,我们的动机很简单; 便利和自动化,不应该将JSON与Swift结合使用…… www.json4swift.com CuteBaby:Mac App Store上的Swift JSON模型 阅读评论,比较客户评价,查看屏幕截图,并了解有关CuteBaby:Swift的JSON模型的更多信息。 下载… itunes.apple.com #VectorImageXcode Xcode 9中的矢量图像 在Xcode 6及更高版本中,我们能够将PDF矢量图像添加到Xcode资产目录中。 这是管理您的… jgonfer.com 的好方法 #OptimizingSwiftBuildTimes fastred / Optimize-Swift-Build-Times Optimizing-Swift-Build-Times –关于优化Swift项目的编译时间的建议集。 github.com

容器视图控制器Redux

在上一篇文章中,我讨论了iOS中容器视图控制器与组合相关的用法。 在本文中,我想通过在一个具有协调器和多个内容屏幕的更复杂的应用程序中的插图来扩展该概念。 让我们开始吧! 以防万一您没有阅读上一篇文章,或者只是需要对视图控制器包含进行快速复习,我们将回顾基础知识。 自iOS 5以来,自定义容器视图控制器就已经存在,并且由Apple提供,部分是为了防止他们认为滥用应用程序中的视图层次结构。 当来自一个视图控制器的视图层次结构被“剥离”并放置在另一个控制器的视图层次结构中时,就会发生这种情况。 苹果公司提到这种方法会导致层次结构不一致。 不一致的层次结构会导致外观和旋转方法无法正确转发到层次结构的各个部分,进而导致意外行为和不良的用户体验。 苹果的演讲可以在这里找到: WWDC 2011 —第102节 。 在上一篇文章中可以找到添加子控制器的基本代码。 为了更好地演示容器视图控制器的用法,我创建了一个示例应用程序,该应用程序实现了各种包含方法。 这个应用程序旨在模拟一个真实世界的应用程序,而不仅仅是关注视图控制器的包含。 尽管视图控制器示例有些人为设计,但该应用程序使用视图控制器容器以及流协调器,协议,类扩展,依赖项注入和其他几种应用程序体系结构技术来尝试为视图控制器容器提供更广泛的上下文。 我们将遍历每个屏幕,并探索组成该屏幕的组件。 该应用程序的根视图控制器是一个UITabBarController由四个内容视图控制器组成。 第一个选项卡是自定义ContainerViewController的示例,该ContainerViewController是一个标准视图控制器,用于管理其他两个视图控制器的内容。 这旨在说明两个概念。 首先,一个图像加载视图控制器将图像简单地加载到视图控制器中(从Dave DeLong借来的一个概念)。 ImageViewController用ImageLoader对象初始化,该对象进行网络调用以检索图像。 就是这样,它无所不包,简短而简单。 其次,屏幕的下半部分是ListViewController ,它只是一个UIViewController ,其中包含一个UITableView ,该UITableView从Web加载一些JSON数据。 ListViewController使用ListLoader对象初始化,以进行网络调用以检索数据。 DataSource被分离成单独的ListDataSource,它只是一个Swift对象,用于管理节,行计数和单元格创建。 同样,非常简单明了。 这些控制器中的每一个都使用容器来添加LoadingViewController ,这是一个仅包含活动指示器的视图控制器。 我已经在多个应用程序中使用了此概念,它非常有用,尤其是当您具有自定义活动指示器时。 加载数据后,将删除加载视图控制器。 在ListViewController选择一行将过渡到新的ListDetailViewController 。 该控制器采用像以前的视图控制器一样的ImageLoader对象来加载较大版本的图像。 我们也可以在这里使用图像加载视图控制器,但是我想展示如何覆盖loadView以在视图控制器的代码中提供自定义视图。 此方法在以后的视图控制器中再次使用。 此ListViewController还实现了窥视和弹出动作,这些动作正逐渐成为应用程序中预期的用户体验。 实施此行为时,会发现协调员存在问题。 协调器用于弹出动作,就像用于任何其他导航流一样。 但是,peek直接在ListViewController 。 这与期望协调器模式如何工作相反,因为视图控制器不应该知道任何其他视图控制器。 问题就变成了谁应该处理该视图控制器的销售? 列表视图控制器对协调器的存在一无所知。 我们是否应该将其移到ListViewController协调器中并注入该协调器,以便列表可以请求窥视视图控制器? 我们是否应该考虑将工厂对象出售给窥视实例的视图控制器? 我仍然需要回答这个问题,因为理想情况下,我们希望ListViewController能够基于列表内容显示不同的详细信息屏幕。 在当前的实现中这是不可能的。 该概念由Halide应用程序的Ben […]

Swift并行编程:基础知识

大约一年前,我的团队开始了一个新项目。 这次,我们希望利用从先前项目中获得的所有经验。 我们做出的决定之一是使整个模型API异步。 这将使我们能够更改模型的整个实现,而不会影响应用程序的其余部分。 如果我们的应用程序能够处理异步调用,则无论是与后端,缓存还是数据库进行通信都没关系。 它还使我们能够同时工作。 同时,它具有一些含义。 作为开发人员,我们必须了解并发和并行性等主题。 否则,它将使我们陷入困境。 因此,让我们一起学习如何并行编程。 同步与异步 那么,同步处理和异步处理之间的真正区别是什么? 想象一下,我们有一个项目清单。 在同步处理这些项目时,我们从第一个项目开始并先完成它,然后再开始下一个项目。 它的行为与FIFO队列(先进先出)相同。 转换为代码意味着:方法的每个语句将按顺序执行。 代码中的一个示例是简单的回调。 我们可以看到在处理回调之前最后执行的代码。 但让我们想象一下,我们可以同时使用多个工作程序。 他们每个人都将带一个盒子并一直携带。 这会大大提高我们的生产率,不是吗? 由于我们使用多个工人,因此增加的数量与我们拥有的工人数量相同。 只要至少有2名工人同时搬运箱子,他们就会并行进行搬运。 并行是关于同时执行工作。 但是,如果我们只有一名工人并且可能使用更多的工人,会发生什么? 我们应该考虑在处理状态下有多个盒子。 这就是并发性。 可以看作是将A到B的距离分为多个步骤。 工人可以将箱子从A拿到整个距离的中点,然后回到A抓住下一个箱子。 使用多名工人,我们可以使他们所有搬运箱子的距离不同。 这样,我们异步处理盒子。 如果我们有多名工人,我们将并行处理这些箱子。 因此,并行和并发之间的区别很简单。 并行是关于同时进行工作。 并发是关于同时进行工作的选择。 它不必并行,但可以并行。 我们的大多数计算机和移动设备都可以并行工作(由于内核数量的原因),但是您拥有的每个软件肯定可以同时工作。 每个操作系统都提供使用并发的不同工具。 在iOS中,我们拥有默认的工具,例如进程和线程,但是由于其在Objective-C中的悠久历史,因此也有调度队列。 处理 流程是您的应用程序的实例。 它包含执行应用程序所需的所有内容,其中包括堆栈,堆和所有其他资源。 尽管iOS是多任务操作系统,但它不支持一个应用程序执行多个进程。 因此,您只有一个过程。 查看macOS有点不同。 您可以使用Process类产生新的子进程。 它们与父进程无关,但包含父级在创建子进程时拥有的所有信息。 如果您使用的是macOS,下面是创建和执行过程的代码: 苹果公司对上述内容的实施称为“大中央派遣”(简称GCD)。 在iOS中如何处理? 优先继承 优先级反转的解决方案是优先级继承。 在这种情况下,只要线程1被阻塞,就将其优先级交给线程3。 因此,线程3和2具有较高的优先级,并且都可以执行(取决于操作系统)。 3解锁资源后,高优先级又回到线程1,它将继续其原始工作。 […]

在Swift中实现编程语言—第8部分:函数

注意:这是“用Swift编写编程语言”教程系列的第八部分。一定要检查一下 以前的内容 。 在先前的教程中,我们已经实现了一个小计算器解释器,该解释器支持变量声明和表达式。 下一个要添加的功能是对功能的支持,在本教程中,我们将介绍功能支持的陷阱,并讨论如何实现它。 设计功能声明 过去,某些编程语言在函数定义方面颇具创意。 从Objective-C: //实例 -(无效)myMethod:(字符串)参数 // 静态的 +(无效)myStaticMethod:(字符串)参数 要使用JavaScript的箭头功能: (参数)=> {…} 但是自C语言以来,大多数编程语言都是相当传统的语言,并遵循C样式定义: :: = (){} 其中, 导致某些字符序列(一个单词)。 那么……我们的功能应该如何? 通常,在实现一种语言时,我们希望在创造性和传统方法之间找到一个甜头。 我们希望使用我们的语言的程序员可以谈论一些话题,同时又希望我们的语言直观易读。 但是,由于我们出于教学目的而设计语言,因此我们只是希望事物尽可能直接和传统。 因此,我们语言中的函数看起来与传统的C样式函数定义非常相似: 函数someFunction(firstArgument,secondArgument){…} 我们的语言没有类型检查,因此我们将使用关键字“ function”来标记函数定义的开始,而不是在参数列表中使用传统的返回类型和跳过类型规范。 最后,我们在函数的代码块周围使用匹配的大括号。 实施思路 在上一教程中,我们讨论了添加对变量的支持,事实证明这很简单,只需四个简单步骤: 我们为变量声明添加了一个struct 我们在解析器中添加了一个parse方法来创建该结构的实例 我们为变量及其值添加了全局内存存储(一个简单的字典) 我们实现了该结构的解释过程,该过程简单地存储了变量声明的表达式的解释值,并使用变量名作为键将其存储在我们的全局变量字典中。 我们可以用不到50行的代码来完成所有这些工作。 添加功能是一个相似的过程,但是在内存存储方面有两个主要区别(3)。 我们将需要字典将其映射到Node值而不是当前Float ,以便可以懒惰地评估该节点。 处理变量时,我们的内存存储区必须牢记范围。 范围处理 当涉及范围处理时,有两种方法值得一提。 我们可以有词汇范围或动态范围 。 词汇范围 这是大多数编程语言所使用的。 在词法作用域中 ,变量的解析取决于它们在源代码中的位置。 动态范围 对于动态范围,变量的解析取决于运行时的用法: var x = […]

Swift:XCode发布错误 运行脚本警告

普通显影剂。 Hele Ben😰 Geneldebazışeylerihatırlamakiçin 评论专栏laroluşturuyoruz。 Nasılolsa ileridegörürümvedüzeltirim yaaaaaa 💆‍♂️ diyerek。 Bence buhatırlamaolayıprojedeki kodsatırıile tersorantılı。 Satırlararttıkça 评论 lerarttıkça,儿子释放 de konstol ediyor muyuz acabaeklediğimcommentlerden birisinde,bir metodu veyabaşkaherhangi birdeğişikliğiişaretettiğimizi吗? 生成 esnasındabu gibidurumlarıhatırlamakiçin 运行脚本 lerkullanıcazşimdi。 ÖncelikleXCode➡项目(目标seçiyoruz)➡构建阶段sekmesinde solüsttebulunan + ile新运行脚本Phase’iseçerekyeni bir运行脚本oluşturuyoruz。 Gördüğünüzgibi 发布了 buşekildeuyarılarıalıyoruz的构建。 Bunlarınhiçbiri 调试生成脚本 izade sadece 发布 içinbuuyarılarıverdiğimizden。 脚本 1号出口yazansatırısilerseniz 错误 verir ancak 构建 失败 olmaz,或关闭。

适用于iOS和Node.js的最小客户端-服务器示例

在本教程中,我将向您展示如何设置Node.js服务器和与其交互的iOS应用。 Node.js 我们将从设置服务器开始。 本部分基于本教程的Android版本。 下载并安装Node.js。 为您的服务器应用程序创建目录。 我们称之为node_server 。 mkdir node_server cd node_server 使用Node Package Manager设置一个新项目: npm初始化 接受除入口点以外的默认值。 我将使用名称app.js而不是index.js 。 然后创建一个名为app.js的文件。 触摸app.js 在您喜欢的编辑器中打开该文件。 许多人使用Visual Studio Code。 让我们使用入门指南中的代码。 将其粘贴到您的app.js文件中。 const http = require(‘http’); const hostname = ‘127.0.0.1’; const port = 3000; const server = http.createServer((req, res) => { res.statusCode = 200; res.setHeader(‘Content-Type’, ‘text/plain’); res.end(‘Hello World\n’); }); server.listen(port, […]

编程语言的力量将在2018年引起关注

2018年即将来临,如果您是开发人员,您可能会想知道,明年编程语言将如何吸引您!根据GitHub编程语言使用统计,今年排名前列的编程语言与去年相同- C和Javafighting居首位。 事实没有什么令人惊讶的,不是吗? 在此博客中,我们打破了人们的期望并竭尽所能,以理解将在2018年发展壮大的最强大,引人入胜和有希望的编码语言。检查所有方面是否看起来我们的期望将是有趣的一倍,才有效。 我们概述了对编程语言的预测,这些语言将在2018年主导游戏的发展– 的JavaScript JavaScript在这个季节风靡一时。 最近在前端编程世界中发生了如此多的惊人产品。 总而言之,您不能忽略React成为开源JavaScript库的方式。 到现在为止,众所周知的和有效的方言有了更多的区别。 响应几乎可以解决您所付诸的一切。 前端流畅吗? 它就是为此而设计的。 虚拟现实和增强现实? 检查React VR。 多阶段的东西? React Native涵盖了这一点。 另外,现在您甚至可以使用它来克隆Facebook。 TypeScript也上升了。 TypeScript是一种免费的开源编程语言,它是JavaScript的严格语法超集,并向该语言添加了可选的静态类型,可在任何地方运行,适合于构建大型应用程序,此外,它还用于Unity Engine中 。 爪哇 Java技术使您可以在安全的计算环境中工作和娱乐。 Java根据TIOBE索引在编程语言排名中排名第一,它用于创建我们非常喜欢的Android应用程序-Uber, Slack , Tinder , Amazon等。 Java开发功能可用于从基本移动应用程序到游戏和VR应用程序的所有内容。 只要记住要给它足够的内存即可。 ROR(Ruby on Rail) 关于ROR的淡出和Node.js的取代一直存在着积极的争论。 我们说:不! TIOBE指数表明ROR也是相关的。 Ruby在2月份排名第11位,与2016年的排名完全相同。TIOBE会根据全球熟练技术工程师,课程和利用谁使用编程语言的外部商人的数量来选择评估。 ROR很难学习,这是事实,并且Rails开发中的红宝石需要非常精确的方法。 Ruby on Rails是一个基于服务器的Web应用程序框架,在Rails 5发布后,它具有新的Web开发潜力。 Turbolinks 5和ActionCable等功能非常出色。 开发人员现在可以摆脱客户端JS框架,并使用Turbolinks 5从Rails堆栈直接生成单页应用程序。他们还可以通过ActionCable将WebSockets与其他Rails应用程序集成。 这使开发人员能够以与其他Rails应用程序类似的形式和样式在Ruby上实时编写功能,同时保持良好的可伸缩性和流畅的性能。 C# C#是创建平台或VR(虚拟现实)应用程序的不错决定。 它让人联想到Java,使用和编写代码的需求也比JavaScript少。 C#非常适合各种企业应用程序。 […]

Swift中的局部推理

Swift是一种令人难以置信的表达和强大的编程语言。 我们将探索Swift的一些语言功能,这些功能可使您的代码更易于阅读。 更好的按钮 让我们看一下一种常见的iOS模式,该模式在按下按钮时会打印一条消息。 如果您已完成任何iOS教程,则很有可能您之前已经看过。 选择器模式用于整个UIKit ,并不一定是不好的做法。 但是,我们可以做得更好。 当选择器声明和按钮的动作之间有很多代码时,就会出现此问题。 如果开发人员是第一次阅读本文,那么对他们而言,从根本上失去对您的功能的了解是很普遍的。 这两行代码是松散耦合的。 它们要求读者在它们之间跳转以完全理解该按钮。 让我们尝试一种新方法,使用闭包为按钮分配一个动作。 不用担心-开箱即用UIKit是不可能的,但是让UIButton像这样工作很容易。 除了在一个函数中包含第一个代码段之外,我们还使用了闭包来更清楚地传达单击按钮时发生的情况。 这样可以更容易理解此按钮的功能。 为您的按键操作实现闭包非常简单。 创建一个带有action属性的自定义UIButton子类,该属性是一个闭包。 我们在内部连接按钮的选择器,并在目标函数中执行关闭。 该解决方案可以扩展为包括UIButton的其他动作的关闭,例如touchDown , touchDragExit等。 局部推理 将相关信息保持在一起可以改善本地推理。 本地推理是一种想法,使读者可以直接在代码前面理解代码,而不必去探索代码的工作原理。 在WWDC 2016上,Apple工程师作了题为“ UIKit Apps中的协议和价值导向的编程”的精彩演讲,讨论了本地推理的概念。 他们的演讲涵盖了协议以及如何利用其优势超越传统的基于继承的解决方案。 很难将代码组织策略称为无效策略,因为它们通常会根据个人喜好而有所不同。 但是,我建议,最好的代码组织形式是允许读者准确地推理代码,同时最小化遍历代码库的距离。 延迟关闭 让我们看一下另一种常见的Swift设计模式,该模式专注于改进局部推理。 一种常见的做法是在UIViewController子类的viewDidLoad函数中执行设置工作。 就像前面的按钮示例一样,这很好用。 注意,我们在存储的属性声明和覆盖的函数之间划分。 这是我们要重点关注的问题-查找与视图相关的所有代码通常需要搜索。 相反,我们可以使用闭包来初始化视图。 闭包被标记为lazy因此可以在闭包内访问self 。 这允许属性引用在self声明的任何常量,并为任何控件设置目标操作。 此策略也适用于情节提要板。 代替使用闭包,可以使用didSet属性观察器,当故事板设置出口时会调用该属性观察器。 这对于无法在情节提要中设置的视图属性(例如拐角半径,渐变等)特别有用。它会将我们的更改本地化为视图本身。 无需将代码散布到整个文件中,我们可以将其放在一个位置。 协议一致性扩展 协议在整个Swift标准库和Cocoa Touch API中都使用。 它们提供了编译时的保证,即对象具有某些属性或功能。 这是另一个常见的模式,在视图控制器中实现集合视图的委托和数据源。 再一次,这有效。 但是,委托函数通常很长,并且往往会使实现它们的控制对象的大小膨胀。 很难说出某个属性或函数何时满足协议要求,以及它属于哪个协议。 […]

迅速。 功能可选。 第1部分

Optional是Swift中的基本类型。 尽管几乎无处不在,但大多数开发人员并未充分利用它,甚至没有以错误的方式使用它。 可选绑定反对DRY原理,并引入了不必要的条件。 在这个由多部分组成的系列文章中,我们将讨论Optional真正含义,如何正确使用它并应用一些高级知识,以便为Optional计算创建方便的功能性eDSL。 其他重要主题包括Swift中的依赖项注入策略,错误处理,隐式展开的Optionals和类型强制转换。 虽然不能总是避免使用最后两个,尤其是在与Objective-C代码交互时,但它们都是纯Swift的代码味道。 由于本系列的主要目的是理解功能概念以及如何在Swift中应用它们 ,因此我们将讨论和绘制而不是代码。 您会看到,还有很多工作要做。 第一部分从Optional 。 然后我们将讨论可选绑定 。 我们的旅程将把我们引向基本的功能概念: 纯功能 。 在那里,我们将停下来,探索更多内容,直到下一部分。 为什么可选? 在Objective-C中没有“ Optional这样的类型。 相反,如果函数或属性不返回值,则返回nil 空的 NSObject指针。 可以安全地将消息发送到nil并将其作为参数传递。 但是Swift没有像Objective-C这样的指针。 此外,如果任何类型可以为nil ,我们的程序如何保证类型安全? 如果我们传递nil字符串而不是数字,编译器如何弄清楚怎么办? 如果我们将nil传递给无法处理的函数怎么办? 为了处理此问题,引入了Optional 。 有什么可选的? 让我们看一下Optional声明: 枚举可选 { ///没有值 无案 ///值的存在 案例一些(包装) … } 因此,我们看到的第一件事告诉我们Optional是容器类型 :它封装了一个值。 图片 1.简单显示一个可选的Int值容器。 这里的黄色圆圈表示普通类型,而蓝色正方形表示“可选”容器。 您会看到, .none没有任何类型约束,因此使用诸如nil这样的文字很方便。 一个空盒子只是一个盒子,没有什么有趣的。 Optional还可以保护您避免将nil值传递给无法处理它们的函数。 这就是可选绑定起作用的地方。 可选绑定 可选绑定是用于访问包装到Optional的值的语句。 它看起来比声音更好,并且具有熟悉的语法。 如果您已经尝试过一些Swift,您将不会感到害怕 […]

Desarrollar para CocoaPods 2.0

往后的Este和ampliacióndel。 值得推荐的是先前的盐腌制过往的食用前茴香。 顺便说一句,用逗号来表示:imágenes,XIB,视频和演示… 你好,你要参加的考试和考试的理由是什么。 1.编译器变量 不能编译的任何变量。 完全可变的真实性,无论是虚假的还是虚假的实例,都可以轻松地实现。 没有同等身份的塞尔维亚人卢加·唐德·塞斯塔·埃杰库丹多·埃尔·科迪戈。 Tenemos que ponerle un nombre identificativo que solo vayamos a usar nosotros。 Algo como ARControls **否ALGO COMO DEBUG **是es es lo usan muchos desarrolladores y puede llevar错误。 Para configurar estas变量vamos: Proyecto>构建设置>其他Swift标志 Pulsamos Sopart la parte derecha de la celda yañadimos- D 哟-DARControls。 Seguramente ospreguntéispor se Pone -D […]