Tag: 数组

使用带有下标的POP(面向协议的编程)的正确方法。

下标用于使用索引快速访问集合,序列和任何其他可迭代类型。 也就是说,您可以通过索引要更改的集合来获取和添加项。 下标的核心是主要索引没有其他功能的集合。 您可以快速阅读有关下标的更多信息 。 从上一张图片中,我决定让我的容器通用,以确保我所有集合的特定功能。所以我们在这里要做的是创建一个通用容器 ,该容器可以管理或协调如何访问或计算集合项( 项 )。 您可以在其中通过为容器的私有项编制索引或使用添加和获取功能来对容器进行下标。 在下面的示例中,您可以通过对项目进行下标或使用添加的功能get和add函数来访问该项目。 采用这种方法可以避免开发人员跨代码库编写冗余的业务功能。 而是创建特定于您的收藏的东西。 谢谢。

您是否在写Objective-Swift?

Objective-Swift [名词]:以Objective-C的约定和约束编写的Swift代码 在学习Swift的早期,我可能不知道或根本太害怕使用该语言的强大功能。 我以Objective-C的形式编写了Swift代码,导致不必要的可变性和多余的额外行。 以下是一些我最终不懂得好处的习惯。 出队细胞 客观快速 迅速 避免cell变量 没有可选的cell可以强制展开 行数少 命名空间常数 客观快速 扫一扫 改进了相关常量的可读性 富有表现力的枚举 物镜转换 迅速 没有重复的字符串; 字符串与枚举大小写相同 添加诸如OPTIONS类的另一种方法仅需要添加另一种情况 阵列运算 客观快速 迅速 没有创建其他变量 富有表现力的代码读起来就像一句话; “获取姓名并映射到其大写版本,并为每个姓名打印出来” 类型检查 客观快速 迅速 没有力量解开 结论 从Objective C背景学习Swift可能会导致称为Objective-Swift的代码。 Swift比Objective C具有许多优势,因此,恳请您发现利用这些语言的高级功能的方法。

Swift数组vs ContiguousArray

我们都每天使用数组。 但是我们是否考虑过有效使用它们? 在这里,我将讨论一种技术,通过该技术,我们可以基于其中的Element改善数组的性能。 数组–理想元素 尝试在数组中使用值类型。 使用值类型时,优化器可以消除Array中大部分的开销,这些开销是处理数组支持NSArray的可能性所必需的。 通过使用没有引用类型的值类型,可以避免额外的保留,释放Array内部的流量。 但是要小心并考虑在使用大值类型与引用类型之间进行权衡。 您可以在此处了解更多信息。 ContiguousArray ContiguousArray类型是一种特殊的数组,始终将其元素存储在内存的连续区域中。 如果数组的Element类型是类或@objc协议,并且您不需要将数组桥接到NSArray或将数组传递给Objective-C API,则使用ContiguousArray可能比Array效率更高,并且具有可预测的性能。 如果数组的Element类型是结构或枚举,则Array和ContiguousArray的效率应相似。 考虑以下课程。 班级地址{ var street =“” var city =“” var state =“”; 枚举AddressAttributes { 凯斯街 凯斯城 案件状态 } func updateAttribute(值:字符串,属性:AddressAttributes){ 开关属性{ case.Street: 街道=价值; 案例城市: 城市=价值; 大小写 状态=值; } } } 我测量了将此类对象添加到Array和ContiguousArray所需的平均时间。 我采用了一个任意值(1000000),只是为了演示如何在更大范围内表现不同。 func testPerformanceForClassArray(){ 让地址=地址() var数组:[地址] = [] 自我衡量{ for _ in […]

flatMap方法的实际应用— Swift 3

这一次,我们将讨论flatMap方法。 但是首先让我们考虑一下上下文。 假设我们有一个数组数组: var arrayOfArrays = [ [1, 1], [2, 2], [3, 3] ] 将其内容乘以2是一个挑战,其结果应如下所示: // [[2,2],[4,4],[6,6]] 解决此难题的一种方法可能是两次使用map Array的方法,如下所示: //首先迭代数组的数组 arrayOfArrays。 映射 {数组在 //和第二次迭代 //当前数组 返回数组。 映射 {中的整数 //将其内容乘以2 返回整数* 2 } } // [[2,2],[4,4],[6,6]] 好的,接下来是一个新的挑战,将乘法数组转换为仅一个数组,如下所示: // [2,2,4,4,6,6] 幸运的是Array的结构为此目的有一个称为joined ,让我们使用它: var multipliedByTwo = arrayOfArrays。 映射 {数组在 返回数组。 映射 {中的整数 返回整数* 2 } } var flattened […]

让我们每周一次洗牌

在Flatiron学校的第一周,他们给了我们二十一点实验室一个工作。 我慢慢地开始逐步研究它。 我创建了卡片,播放器,卡片组,引擎,并设置了所有实例,方法,初始化程序等。一切都以正常且良好的速度向前发展,直到实验室指示要求我对卡片组进行洗牌。 说明: 我的第一个想法是“这很容易。 因此,我开始在arc4random_uniform()周围键入各种不同的变体,但似乎无济于事。 在花了很多时间尝试解决这个问题之后,我决定发挥创造力,并提出了自己的解决方案,我将其称为“弗兰克·辛纳屈”。 第一周:弗兰克·辛纳屈 开始了。 让我们将其分为几步: 我们的任务是创建shuffle()方法,以获取包含52张随机洗牌的卡组。 这时的牌组“ undealtCards”是一副纸牌,看起来像这样: 我的第一个想法是创建一个名为“ cardsToShuffle ”的纸牌阵列,并确保我名为“ undealtCards ”(我的副牌)和“ DealtCards ”(另一副装有发牌的牌)的两个阵列是空的。 然后,我用一个for循环填充我的arraycardToShuffle阵列,使我的Card类中的所有西服和等级符合我的52张牌。 此时,问题是我有一副纸牌,但它们又重新排列好了,没有被洗掉。 最后一部分是创建一个新的for循环,在该循环中,我们以随机顺序将所有Cards从cardsToShuffle移至undealCards 。 并做了! 我们设法洗牌了。 如果一切顺利,我们应该有两个空数组( cardsToShuffle和DealtCards )来启动, undealtCards应该有52个Card元素被改组。 我不得不说,我为自己感到非常自豪。 尽管现在看来这很容易,但是在第一周想出这个解决方案对我来说感觉非常好,我做到了。 第二周:印第安纳·琼斯 一周后,当我们回顾二十一点实验室的工作时,一位同学(@ramamilaneha)向我展示了一种改组甲板的更好方法。 我们将其称为“印第安纳琼斯”。 解决方法如下: 我们将创建一个for循环,该循环将从0到几乎undealtCards计数运行。 然后,我们将使用arc4random方法获得randomIndex。 然后我们验证i值是否与randomIndex不同,并以良好的“ Indiana Jones”风格交换了每个元素的顺序 第三周:魔术技巧 然后,在熨斗学校的第三周开始了,随之而来的是更多的实验室。 我认为经过一两个实验室之后,我们又不得不改组阵列。 老实说,我回到了最初的“ Frank Sinatra”解决方案,因为那时我还不太了解“ Indiana Jones”的方式。 我输入了整个解决方案,几分钟后,我决定必须有一个更好的方法。 我用谷歌搜索,直到找到第三个最好的解决方案“魔术”。 这是逐步的: 带来GameKit框架。 现在,我们可以使用GameKit框架中的GKRandomSource类来创建新的纸牌阵列。 然后我们可以调用实例方法“ […]

所有关于Swift中的数组

简介:在iOS开发中,我们每天都使用Array。创建数组的方法有很多。我认为了解Array是什么以及为什么我们可以通过多种方式创建它更重要。在本文中,我将解释什么是array和我们如何通过许多方法创建它以及修改数组中的更新和删除元素。 什么是数组: swift中常见类型的数组。数组可以是Int,String,bool,Class或struct之类的任何时间,也可以是任何类型类似于data type的数据。 示例:如果我们需要存储我们日常购物的5个名称,我们将使用Array来存储以下内容: 这是5个可以这样存储的项目名称。所有通过其索引.index短接的项目都从零到项目数减一。 数组可以是任何类型的元素,例如Int,String,Class,Struct以及Any 数组是Swift中常见的遗传结构类型,用于存储相同类型数据的集合 阵列可变性: 数组可以像var和let一样是可变的或不可变的。如果它的var我们可以更改,则可以更改它。 那么我们如何创建数组: 有很多方法可以创建数组,例如使用默认的初始化程序,带有空元素等。但是Swift是类型安全的语言,在创建数组时我们必须分配类型。将类型提供给swift编译器的两种方法是隐式或显式的。我们将发现所有办法 。 创建空数组: //隐式定义的空数组 let arrayOne = Array ()//隐式定义的空数组 let arrayTwo:Array = Array()//空数组 让arrayThree:[Double] = [] //短于 let arrayFour = [Double]()//短于 我们在这里看到,需要指定类型,因为Array结构是泛型类型: struct Array :RandomAccessCollection,MutableCollection { //确认所有协议方法 //初始化器 //方法 //下标 } 因此,这就是为什么我们需要向Swift Compiler指定什么是Element。 使用初始化程序创建数组: //带有初始化程序的数组 1.let arrayFive = Array([1,3,4,5,6]) //使用数组文字 2.let arraySix = Array(arrayLiteral:1,2,3,4,5) […]

在Swift中以函数方式计算两个数组的差

本周,我遇到了我的朋友MateuszMaćkowiak提出的挑战,以解决他创建的diff函数中的问题。 给定两个数组,他的目标是检索: 通用元素:两个数组中的元素。 插入的元素:不在第一个数组中但在第二个数组中的元素。 删除的元素:不在第二个数组中但在第一个数组中的元素。 不过有一个陷阱。 元素不可比较,也不可等于 ,并且第一个数组的元素可能与第二个数组的类型不同。 但是,该函数将接收compare闭包,该闭包从第一个数组中获取一个元素,从第二个数组中获取一个元素,并告诉它们是否相等。 他向我展示了他的解决方案: 输入数据为: 让a = [Int](0 … 1000) 令b = [Int](750 … 1500)

如何为快速Codable编写强大的模型并再次使用该模型。

在这篇文章中,我将不写什么是可编码协议以及如何使用它! 取而代之的是,我将在一个很短的故事中告诉您如何用快速的语言为其编写最佳模型。 所以走吧… 如果您对编码技术不熟悉,我强烈建议您对其进行详细了解,然后再回到这里阅读其余内容。 你们中的大多数人都可以使用可解码来反序列化JSON文件。 但是如果您想在项目中再次使用该模型作为列表或数组又如何呢? 或者只想从您的项目中的模型创建一个全局实例数组,并进行很多次映射。 不幸的是,许多初级开发人员将创建另一个模型结构并使用该模型结构。 但是它们可能会遇到可选选项或强制展开的问题。 假设此JSON文件为: { “ name”:“ John”, “ lastName”:“ Doe”, “年龄”:27 } 在此JSON文件中,我们有一个简单的用户数据。 所以我们从简单的模型结构开始: struct user_Model:Codable { 让名字:字符串? 让lastName:String吗? 让年龄:int? } 在此模型中,我们使用“ let” ,并且必须在每个参数的末尾添加可选的“?” ,以避免反序列化错误。 如果该参数在该JSON文件中不存在,它将返回“ nil”而不是该参数。 因此,我们应始终处理“无”。 another另一方面,您无法通过安全展开来制作该模型的另一个实例。 这将发生: (testUser?.name)! 这太错了。 也许您说我们可以使用Class而不是struct,然后使用: 必需的init(){ } 并在那里初始化每个参数。 像这样 : class user_Model:Codable { 变量名称:字符串 var lastName:String var age:Int 必需的init(){ self.name […]

Swift中数组的受限扩展

协议和扩展是快速发展的组成部分。 到目前为止,您可能已经使用了很多时间。 您可能出于各种原因为您的班级或结构创建了扩展。 这里我将给出一些示例,其中您可以为几个现有的类进行扩展。如果你们还记得在Objective-C上工作,那么您将与Catagories交叉。 在这里,约束扩展是一种类别,您可以在不知道其内部工作的情况下扩展现有对象的功能。 在这里,我将以数组为例,数组是同质元素的集合,在进行实时项目时,您需要处理很多需要不断操作的数组,您可以提出扩展一样的 字符串数组 让我们假设一个场景,其中您有一个字符串数组,并且需要事先存储少量数据,例如 总字符数 字数 每个单词中的字符数 让我们来看一个数组示例,如下所示 let arrayString:[String] = [“教父”,“肖申克的救赎”,“辛德勒的名单”,“愤怒的公牛”,“乱世佳人”,“绿野仙踪”,“阿拉伯劳伦斯”,“阿甘”] 现在,假设您在整个项目中具有与上述所需的实现相同的数组。 为了避免重复并扩展现有Array的功能,我们可以编写如下扩展 通过在Array上实施受约束的扩展,您可以轻松避免代码重复,并且Array操作很容易。 让我们继续测试实施 让characterCount = arrayString.totalCharacterCount() 让wordCount = arrayString.wordCount() 让eachCharacterCount = arrayString.elementCharacterCount() 打印(“ characterCount = \(characterCount)”) 打印(“ wordCount = \(wordCount)”) print(“ eachCharacterCount = \(eachCharacterCount)”)//这将打印characterCount = 128 wordCount = 22 eachCharacterCount = [13、24、16、11、18、16、18、12] 这是数字的另一个例子 这是数字数组的另一个例子 在上面的示例中,这里以计算为例 数组元素的总和 将数值数组转换为字符串数组 这可以在任何数字数组上无缝运行,但在数组中的其他元素上同样会出错。 […]

映射,过滤,减少,拖放Swift。 简单的高阶函数。

我已经对本文的主题进行了很多思考,并想向您介绍一些有用的且经常使用的简单高阶函数。 今天,我想整理一切,即使初学者也可以理解。 高阶函数对我来说很有趣,我将在这四个方面停下来:过滤,映射,缩小,删除。 当然,有4个以上,但是这些是最基本,最有趣的。 过滤器将此类元素返回给您的数组,并通过某个过滤器。 现在,我将向您展示过滤器如何在原始示例上工作: 传统方式 在emptyArray中,我们将具有以下数字:1、3、5、7、9。 代替这么长的代码,让我们使用filter : 结果,我们得到的答案是相同的,但是我们没有将空对象变成大量,也没有摆脱代码堆。 对数组中的每个元素执行操作以构建另一个数组。 想象一下,首先我们有很多成果: 现在让我们再创建一个由这些水果组成的数组。 传统方式 如果要使用map,我们将提供以下代码: 在此示例中,我们创建了一个名为fruitLowercase的空数组,该数组保留字符串值,并将simpleFruits的每个元素添加到fruitLowercase。 我向您展示了地图上最好和最短的版本,如果您想了解更多有关地图的信息,可以这样做,并将其留在下面的评论中。 过滤器帮助我们合并数组中的所有值并获得单个结果。 假设我们有一个任务要计算该数组中的所有字母。 这是一种传统方式: 传统方式 让我们看看,如果使用reduce将会怎样: 通过使用reduce将4行变成1。 0表示我们将开始增加多少。 当condition返回true时,从数组中抛出元素,返回false时停止。 之前: 传统方式 后: 它比以前容易得多。 好了,仅此而已! 我真的希望您能在项目中使用它,并使您的雇主惊奇。 今天,我向您展示了3种不同的高阶函数。 它们可以缩短您的代码并提高其可读性。 在评论中写下您希望我添加的内容,或在下一篇文章中写下。