Tag: swift

所以我想在Swift中快速将项目分组

介绍 在我们的编程生涯中,有时需要对数据集合进行分类和分组。 排序本身是一个简单的概念-列出未排序的数据列表,并根据一组规则对其进行排序。 是您执行或使您感到沮丧的实现。 以手机中的联系人列表为例。 根据您的情况,该列表可能很小,也可能很长(有时不合理)。 这就是为什么在大多数操作系统上都可以导航到列表中所需位置的方法,而不必花太多时间浏览。 这可以通过排序和分组来实现。 您设置了一些规则,应用程序将进行相应排序。 该实现需要能够快速处理大量数据,否则打开“​​联系人”应用会变得很麻烦。 假设我向互联网机器查询了过去二十年来发行的所有电影的列表。 如果要在iOS应用中显示该图片,则需要按字母顺序对其进行排序,因为我们每年要谈论成千上万部电影。 我想要的UI很简单,将UITableView分组为AZ部分,并且在右侧有一个部分索引标题栏,这使我可以像rolodex一样向下滑动列表。 我已经多次看到类似的实现: 令u = u中的v表示“ ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789” var x = [Movies]()for电影中的y { 如果让z = y.name.prefix(1),则z == v { 临时附加(y) } } indexedList.append((v,x))} 松散地,正在做的是遍历字母和每个匹配的电影,使数据结构如下: [(“ A”:[电影,电影,电影]),(“ B”:[电影,电影]),(“ C” …)] 该算法的时间复杂度可能为O(n²) ,因为每次外循环运行N次 ,内循环运行M次。 换句话说,电影列表越长,实现就越需要时间来完成。 将其与iPhone 6配合使用,几乎要花整整两秒钟的时间才能对15,000件物品进行排序。 令人沮丧的缓慢。 让我们使用字典分组 通过在Swift中使用字典分组,我们可以在某种程度上克服这一问题。 我拿了电影清单,写了一个谓词: 让谓词:(电影)->字符串{ 警卫让c =字符串($ 0.title.prefix(1))否则{fatalError()} 让字母=“ ABCDEFGHIJKLMNOPQRSTUVWXYZ” […]

斯威夫特剧院

程序执行者容易受到儿子执行死刑的侵害。 除此以外,重要的反叛者也是重要人物。 Créerun type d’erreur d erreur类型的“默认”错误版本“ VersionParseError”使我符合协议“ Error”。 在peen rencontrer上获得Cerest ce loc quiper permettre de Capturer etgérertous les type d’erreurs que l’on 丹斯·勒· 杜 (Dans le do )在appret notre 投掷功能 àl’aide dumot -clétry上, 丹斯·查克追上了法雷特d’erreur que l’on veutgérer 。 在运行时,根据捕获的错误和执行情况,也可以根据执行人员的指示进行操作。 恩芬(Enfin),勒德尼耶(le dernier)在n’aurait paspenséepeuvent上捕捉到了无害的法律和义务的汽车。 在所有人面前,alors tous les抓住了serontignorés。 所有版本的les erreurs dans chaque catch均标榜为une版本和简洁版本。 公平的公平对待: ligne 6,在错误的通讯录中,您将在rencontrée的所有语言中找到正确的答案。 Quelques […]

使用Swift 4学习iOS开发的免费资源

如果您在Instagram上关注我,那么您现在可能已经知道我过去一个月一直在学习本机iOS开发。 我一直想从事移动开发已有一段时间,现在我有机会在MedMen工作,现在我需要我帮助使用Swift 4.2和Xcode 10来构建应用程序。很难找到巨大的资源,尤其是免费的。 那里太多了,很难找到好的。 这是我过去一个月一直在使用的一些资源,可以帮助我学习。 请记住,这些资源中有很多是假设您已经具备编程知识的。 基本上,您应该已经至少知道一种语言,并且熟悉诸如函数和变量之类的基本概念。 以编程方式学习UI设计,无需情节提要 以下视频向您很好地介绍了使用代码(而不是Storyboard)创建应用的UI。 对于开发人员来说,知道如何做到这两者都是件好事。 大多数教程都使用情节提要,但我最终从这个家伙那里找到了一系列不错的视频,向您展示了如何使用代码来完成这些操作。 许多团队可能也会更喜欢您以编程方式发表观点。 这是因为版本控制比较容易,而Storyboard却有点混乱。 如果您自己构建一个应用程序,则可以按自己的喜好坚持使用Storyboard。 苹果在Swift上的官方电子书 苹果对Swift编程有相当扎实的介绍。 Swift编程语言4.2是一本很棒的快速阅读语法概述的文章,快速介绍了如何声明变量和函数之类的内容。 要深入研究实际构建本机应用程序并熟悉ARKit和UIKit等可用框架,请阅读使用Swift开发App。 这本书的目的是将可以入门的完整知识带给可以编写简单应用程序的初级开发人员。 如果您已经了解基本的编程概念,则可以跳过某些部分,直接跳到解释可用框架以及如何实际构建简单应用程序的部分! 我目前正在亲自阅读这两本书,并发现它们很容易理解。 观看Sean Allen的iOS开发视频 肖恩·艾伦(Sean Allen)提供了一些有关构建本机iOS应用程序的精彩视频。 我强烈建议您查看他的视频。 他快速介绍了如何构建一个非常简单的移动应用程序,以帮助您入门,并了解构建移动应用程序的方式。 我希望这些资源可以帮助您开始进行移动开发。 如果您来自Web开发背景并且了解React或Angular,我想添加一些有关UIView及其子类的提示。 只需将它们视为组件即可! 每个部分都独立工作,并具有自己的功能和控制器。 祝您好运,编码愉快! 🙂

在xcode中查找非本地化的字符串

我不会在本文中解释如何在iOS中进行本地化。 深入了解基础知识,我们可以通过两种方式对字符串进行本地化。 在代码中,使用NSLocalizedString(“someStringToLocalize”, tableName: nil, bundle: Bundle.main, value: “”, comment: “”) 。 使用情节提要本地化。 通常在代码中添加NSLocalizedString(:方法,然后忘记将其添加到Localizable.strings文件中。此外,我们可能会对情节提要文件进行本地化,并稍后在UI中添加一个新标签,而您会忘记添加本地化的情节提要字符串文件。 为了跟踪这些愚蠢的错误,xcode 7及更高版本提供了一个选项。 在方案编辑器中,查看“选项”选项卡。 在以下屏幕截图中,我启用了“显示非本地化的字符串”。 显示非本地化字符串复选框需要选中,我们可以根据需要选择应用程序语言。 然后编译并运行该应用程序。 我添加了一个字符串作为标签的文本(CalculatorDisplay是一个UILabel): CalculatorDisplay.text = NSLocalizedString(“某些本地化字符串”,注释:“”) 另外,在“Some localized string”文件中未添加字符串“Some localized string” 。 在这种情况下,它将在调试器中引发错误。 情节提要中可本地化的字符串: 对于未在.strings(YOUR_LANGUAGE)文件中添加的情节.strings(YOUR_LANGUAGE)的可本地化字符串,调试器将引发以下错误: 让我们检查第一个错误: 复制GsZ-Y5–7R1 在错误中提到并在整个项目中进行搜索。 它似乎是UIButton的对象ID,可本地化的文本是UIButtons标题。 单击搜索结果,它可能会在情节提要中突出显示该对象。 情节提要字符串文件通常如下所示: 哪里, GsZ-Y5–7R1 是UIButton的对象ID。 现在复制GsZ-Y5–7R1.normalTitle 并将其添加到字符串文件。 “ GsZ-Y5-7R1。 normalTitle” = “Localized title for button”; 做完!!!!! 结论: 本文未介绍如何本地化字符串文件和本地化情节提要文件。 […]

关于值和引用类型的快速指南

Swift中的值和引用类型定义了如何在代码中直接传递变量或通过复制数据来传递变量。 它们的用法会极大地影响您组织和编写代码的方式。 值类型 值类型是不可变的,一旦设置就无法编辑。 对变量的任何更改都会导致该值类型的新实例。 如果使用诸如var i = 10类的变量,这似乎违反直觉,因为vars是可变的,但实际上,每次更新该变量时,我们都会创建一个新的内存中实例。 “ 值类型最基本的区别特征是复制-赋值,初始化和参数传递的效果-创建具有其数据唯一副本的独立实例 ”-Swift Blog 考虑以下代码: var testScore:Int = 80 var studentA.testResults = testScore testScore = 90 如果我们读出学生A的测试结果,我们期望他或她的分数为80。这是因为变量studentA.testResults设置了内存中有testScore的副本,而不是 testScore的实际实例。 将值类型分配给变量后,对其进行的任何更改均不会影响该变量。 像testScore这样的Integer使用值语义来实现此结果。 参考类型 引用类型是对象的共享实例,直接在代码中传递。 将其从一个变量复制到另一个变量时,它们都将访问相同的实例和数据。 因此,更改一个将影响另一个。 类TestResults {var score:Int?} var results = TestResults()var studentA.testResults = results var studentB.testResults = resultsstudentA.testResults.score = 95 studentB.testResults.score = 75 如果我们读出测验分数,则两个学生的测验分数均为75! 这是因为类是使用引用语义构建的。 学生A的测试结果引用了与学生B相同的results变量,因此当我们将分数更新为75时,两个学生均获得新成绩。 […]

介绍Dyno🦕

更新:本系列的第二篇文章 现已发布 ! Dyno是一个正在构建的新Swift库,用于: 为Amazon AWS DynamoDB数据库提供功能性,反应性,安全且易于使用的界面。 不必担心这是否有意义-或者说有意义但对您没有帮助-因为除了实用的步骤之外,我还将讨论一些想法和技术,希望它们可以在其他地方使用。 在此过程中,它将: 将官方的AWS Python boto3库与Swift集成 添加强大的异步处理 通过反应性可观察流输出数据 提供macOS和iOS的RxSwift扩展,以简单,声明性的方式将结果集成到您的应用中。 我还将介绍添加一些其他功能: 离线数据存储和同步 DynamoDB某些高级功能的扩展。 附带的目的是说明我在以前的文章中一直看过的功能强大的工具如何能够带来巨大的实际收益。 我还计划在编写这些文章时开发此库。 Dyno源代码可在github上获得 (我将继续对其进行调整,将代码分支以匹配这些文章:本文位于Introduction分支下)因此,即使您仅对其中一些主题感兴趣,继续—并发表评论,并根据需要评论PR和明星😀! Linux /非Apple /服务器端人员,我没有忘记您:即使其中的一些细节有所变化,此处的许多内容还是很有希望的。 本文 在本文中,我们将对这些概念进行一些基本介绍。 然后使用AWS DynamoDB进行设置。 这将是很多初始配置,但是我们完成了:我们将看到如何使用PythonKit从Swift中访问我们的新数据库。 我等不及要开始了! 🦕 认识人物 DynamoDB DynamoDB是来自Amazon Web Services的高可用性和弹性云托管的NoSQL数据库。 它可以极大地扩展,但是对于小用例也是免费的,因此非常适合上手。 Boto3 Boto3是用于与DynamoDB通信的官方Amazon SDK。 它使用Python:其他语言(如Java和Go)可用,但没有Swift。 在Dyno中我们将利用Google Tensorflow团队开发的半官方 Python互操作性(它本身依赖于Swift 5的功能,因此这些文章仅是Swift5。我们将在短期内讨论如何处理该问题)。 )。 我还应该指出, AppSync平台具有对AWS和DynamoDB的AWS支持,该平台是一个复杂的交互库,对于某些应用程序将是一个不错的选择。 但是:它仅适用于iOS; 它非常重且复杂; 而且它不使用反应式编程技术-因此,我正在寻找更具兼容性,重量更轻且功能更多的产品。 观测和反应式编程 响应式编程以一种功能性的方式描述了数据流(“可观察对象”:可能是UI中的按钮单击,网络上的数据包或从云数据存储中检索到的结果),从而使我们能够使用运算符进行操作 。 […]

Swift编程的优势是什么? – Alok Upadhyay –中

如果您想进行完整的iOS培训,可以通过以下详细信息与我联系,我会使用目标C或Swift提供实时iOS应用培训 skype:alok.upadhyay32 邮件:meiosdose@gmail.com 应用程式:+ 91–7838552946 Swift编程的优势是什么? Speed: 大多数类型是结构示例,例如Array,Dictionary,Set,String。 结构是值类型,由值传递,是多线程环境和内存安全(锁,互斥锁等)的不错选择 堆栈速度更快,因为访问模式使分配和释放内存变得很简单(指针/整数只是增加或减少),而堆的分配或释放则涉及到更复杂的簿记工作。 内存管理-对于ARC类和值类型,编译器将使用传统的基于堆栈的分配,就像使用C及其派生语言之类的大多数值类型一样。 枚举-如此丰富的枚举,具有函数,原始和值类型。 更少的Error-Prone:与Objective-C相比,Swift中的App崩溃明显更少, 因为大多数错误是在编译时捕获的,因此发生的运行时问题很少。 更好的语法:简单,类似于python,kotlin,JS。 类型推断—基于r值(如python)的自动类型检测。 类型安全性:严格键入的语言,较少出错。 比较python是动态类型语言 使用写时复制吗? ,我写兔子 Swift是功能,面向协议和面向对象的编程语言。 您不确定变量的初始值,请使用可选参数。 服务器端迅速发展,这是非常新的,也许在不久的将来我们会看到很好的。 扩展 :我喜欢它,在运行时将函数添加到现有类中。 开源:正确! 一个很棒的苹果社区,正在为此工作。 清单可以继续! 如果您想进行完整的iOS培训,可以通过以下详细信息与我联系,我会使用目标C或Swift提供实时iOS应用培训 skype:alok.upadhyay32 邮件:meiosdose@gmail.com 应用程式:+ 91–7838552946

Swift中的LC-3 VM

我遵循了“编写您自己的虚拟机”教程来编写VM。 我决定用Swift编写它,因为我已经有一段时间没有写Swift了,并且错过了编写Swift程序的机会。 码 可以在此处查看该项目的完整源代码。 在几年前阅读Nand2Tetris书和课程之前,我只写过一个VM,也曾是一个玩具,因此早就忘记了一些细节,这就是为什么这次练习是一个很好的复习。 您会注意到代码没有经过优化,但是可以正常工作,到目前为止已经足够了。 存储器和寄存器均表示为UInt16数组。 我本可以直接在内存中使用指向UInt16值的指针,这可能会更快,更优雅。 这是我在实施此项目时(重新)学习的一些有趣的事情。 标志延伸 LC-3 VM使用无符号的16位整数。 但是,某些指令(例如下面描述的ST(存储)指令)要求对一个无符号的16位整数与另一个少于16位的整数进行算术运算。 ST操作通过将寄存器SR指定的内容存储在通过将程序计数器偏移量(PCOffset)位0到8加到程序计数器(PC)的当前值而指定的存储位置中来进行。 PC与LC8机器中的所有其他寄存器一样,都是16位值,而PCOffset是9位宽。 为了能够通过两个值的加法运算,必须对PCOffset值进行符号扩展。 如果PCOffset的最高有效位为0,我们只需在PCOffset的左侧填充0,直到其长16位。 如果MSB为1,则PCOffset用1填充。 值的符号扩展基本上增加了二进制数的位数,同时保留了其符号(正/负)。 Swift中的溢出添加 与在C语言中在Swift中添加两个UInt16整数(或任何无符号整数)不同,C语言没有自动溢出处理功能。 例如,以下代码将在Swift中给出EXC_BAD_INSTRUCTION错误: let n: UInt16 = UInt16(UINT16_MAX) print(n + 5) //EXC_BAD_INSTRUCTION 为了选择无符号整数的溢出行为,必须使用溢出加法(或减法或乘法)运算符&+ 。 let n: UInt16 = UInt16(UINT16_MAX) print(n &+ 5) //4 终端模式 终端对stdin的默认行为是对键盘输入进行缓冲和预处理,直到遇到新行\n ,然后才将其传递给正在运行的程序。 此模式称为熟模式或规范模式。 要为VM实现checkKeyBoard()函数,我需要将每个单独的按键传递给我的程序,而无需任何缓冲并等待输入新的换行符。 这要求将终端设置为原始或非规范模式。 我们可以通过使用tcgetattr()读取终端的属性并将其修改为一个结构,然后将该修改后的结构传递到tcsetattr()来设置终端的属性。 到大端 编写此VM可以使您对字节序进行重新整理。 它提醒我,字节序是指整数字的各个字节的顺序(虽然字节序可以指的是单个位,但在实践中极为罕见)。 LC-3 VM程序是大端的。 大多数现代CPU体系结构都使用低位字节序。 […]

Codables神级

思雅有简单的入门文章。 Swift 4的即时通讯协议,您的电位器和补充剂应运而生。 洛斯·科德ables的潜在挑战 协议实施细则中的可变版本。 编码科摩皮 Hasta ahora的出血与los codables一样使用para mapear JSON。 JSON协议和JSON协议之间的对应关系。 En cae vamos a ansignar nuestros propios tipos como side un Int o un String se tratara。 日期和日期的使用日期。更改日期。 设置时间戳记,然后在DateModel上添加时间戳。 JSON: { “ name”:“ Pepe”, “日期”:1541423186 } 类型: 最终决赛: 可编码和易腐烂的底漆,油菜和玉米。 普通法院法典 让值=尝试解码器.singleValueContainer() Lo que estamos haciendoahíes sacar un contenedor de unúnicovalor,lo que quiere decir […]

MVC做对了

或一些想法,以更好地设计您的MVC应用 我一直在写有关MVP或MVVM之类的出色架构模式的文章,但是我们软件开发人员必须问自己一个非常重要的问题:我们是否按照预期的方式使用MVC? 我们是否真的研究过MVC还是只是使用了MVC?我们是在一些古老的Objective-C教程中学到的,只是将ViewControllers像神一样实现了所有功能? MVC:什么是MVC? 如果您了解自己的知识,并且不需要任何人提醒您有关MVC的全部信息,请随时跳到下一部分。 我将撰写有关MVC内容的简短概述。 MVC在1970年代开始在著名的Xerox Parc Alto Research实验室中使用。 当苹果家伙从Altos机器上窃取UI时,他们忘记了窃取MVC。 MVC提出的方案是将您的程序分为三层,这两层相互交互,从而自然地分离出软件的职责。 值得一提的是,MVC主要用于具有UI以及与该UI进行用户交互的应用程序。 例如,在后端实施这种模式没有多大意义。 另一个常见的错误是将整个程序视为MVC(实际上并没有错),而是一个更具哲学意义的问题,而不是一个具体的实现方法。 每个视图都应复制MVC三重奏,并且此组件应相互通信。 模型 :模型表示我们在应用程序中使用的抽象。 这可以是用户,销售,物品等。如果我们使用某种网络层,则模型可能在后端启动,并最终由我们的程序继承。 View :View代表实际的用户界面。在iOS / MacOS开发中,我们使用Xcode的Interface Builder(曾经是一个单独的工具,但在最近几年中已成为Xcode的一部分)创建Views。 尽管我们可能实际上并未编写View的代码, Controller :(或实际上是ViewController )如图2所示,这是Model-View-Controller模式的核心组件。 控制器是您应用程序内部结构的基础。 每个应用程序至少都有一个视图控制器,大多数应用程序都有多个。 每个视图控制器管理应用程序用户界面的一部分,以及该界面与基础数据之间的交互。 ViewControllers是我们实现MVC控制器部分的重要部分,但不是唯一的一部分。 我们将在本文中进一步讨论其他类型的Controller。 如Apple文档所述: 对于iOS应用程序,视图控制器提供了应用程序数据与其外观之间的重要链接。 了解何时以及如何使用视图控制器对于iOS应用程序的设计至关重要。 视图控制器是“模型-视图-控制器”设计范例中的传统控制器对象,但它们还有很多其他功能。 在iOS应用程序中,视图控制器提供了管理基本应用程序行为所需的大部分逻辑。 例如,视图控制器管理屏幕上内容的呈现和删除,并响应于设备方向的变化来管理视图的重新定向。 可以合并由和对象扮演的MVC角色,例如,使一个对象同时满足控制器和视图角色的要求,在该角色中,它被称为视图控制器。 MVC并不是真正地构建整个应用程序,它专注于与用户交谈时进行结构化以及用户如何使用它。 如果您正在使用数据库密集型应用程序,那么这可能不是最佳架构。 MVC在每个视图中实现 要牢记的一件重要事情(我实际上与我的一位同事进行过讨论,他的经验非常丰富,所以我想这可能会对其他人有所帮助)是MVC并不是您应用于应用程序的模式作为一个整体,而是在每个应用程序视图中重复执行的操作。 正如我们在一个假设的应用程序的图3上看到的那样,MVC模式在每个View上不断重复。 MVC面临着“大型视图控制器”综合症或问题:我们实际上拥有这些庞大的ViewController,它们可以处理所有事情:网络呼叫,业务逻辑,数据解析, 人类牺牲,猫狗共处……歇斯底里! 一切都交织在一起,解析器在解析完成后更新了UI(为什么不呢?) 如果这个问题没有道理,答案也不是:任何显然不是数据或显然是图形的东西都会被放入无定形的“控制器”集合中,这最终将整个代码库吸入内部,就像黑洞在其下方塌陷一样。自重” Graham Lee,Inside-Out Apps ViewControllers是您的朋友 避免使用这种可怕的,巨大的ViewController的一个好主意是让多个ViewController控制显示给用户的实际View,而不是使用一个由较小ViewController组成的复合ViewController,自iOS 5起可用 […]