Tag: Swift编程

Xcode专家提示:JSON格式

如果您在源文件中具有JSON结构,则可能会得到如下所示的内容: 粘贴和保留格式。 使用保留的格式,我们得到: 如果您像我一样,并且倾向于将头撞在墙上,那么您只会默默地哭泣,浪费宝贵的时间来缩进混杂的JSON。 *我不够聪明,无法独自解决这个问题,一位心爱的同事与我分享了这个秘诀。

使用Swift编程启动和运行

带有可选,函数和字符串的Swift简介 在本文中,您将学习Swift的以下基本知识: 可选,可选绑定,强制展开 2.功能 3.创建数组 4.创建字典,迭代操作 5.字符串运算 6.条件语句,Switch语句,if语句 介绍Swift Swift是Apple开发的新编程语言。 如果您是一名Objective-C程序员,Swift将使您感到熟悉。 它遵循与Objective-C相同的方法名称和参数。 它还包括来自Objective-C的可可框架。 此外,Swift代码可以与Objective-C代码一起使用。 Swift代码更加简洁,执行速度更快且易于调试。 自从Swift引入以来,人们一直在谈论它,并且大多数人发现它易于适应并且更具表达力。 即使是具有数十年经验的Objective-C开发人员,也会发现它简单而直观。 它是如此简单却强大,以至于一段时间后您会感觉到它是第二自然。 Swift简洁,直观且执行速度更快。 最重要的是,它已被广泛采用,github上有成千上万个存储库,您可以在堆栈溢出时找到大多数问题的解决方案。 在进行快速编程之前,我希望您了解Apple引入的一种伟大工具,该工具仅用于学习和尝试这种新语言。 它被称为游乐场。 太好了,您不必担心创建项目或构建项目来编译代码了。 您可以直接尝试使用快速代码并立即查看结果。 这使学习体验更加有趣。 因此,我建议您使用Playground立即尝试和调整代码。 在学习概念的同时尝试自己编写代码是学习编程时最重要的事情。 正是这样才能保持创造力,创新和即兴创作的乐趣。 您不必单独下载或安装它。 您只需要Xcode。 安装Xcode并将其打开后,您将看到以下窗口 要创建一个Playground文件,请选择第一个选项,即Play入门。 您将被带到此窗口: 您可以在这里命名您的Playground文件,并选择iOS或OS X的平台。单击下一步时,系统将要求您选择Mac上的位置以保存项目。 根据您的方便选择,然后单击完成。 现在,您的Playground文件已准备就绪,可以进行编码了。 您将看到以下窗口: 这是一个普通的游乐场文件。 与您的Xcode项目中的类相似。 在左侧,您将看到一个包含字符串“ Hello,Playground”的变量。 在右侧,您会在该行上看到结果或变量的值。 您可以在运行时立即查看任何计算和运算的结果,如下图所示:- 那么,为什么还要浪费时间呢? 让代码! 因此,让我们从基础知识开始: 变数 快速创建变量 在这里,我们定义了一个变量“ myName”,使用var关键字,变量名和冒号“:”来完成此操作。 冒号后面是数据类型,在这种情况下,数据类型是String ( String是Swift引入的新数据类型)。 我们为该变量分配一个字符串值“ […]

Swift 4中的多个ViewController(第2部分)

系列 Swift 4中的多个ViewController(第1部分) 如何在Swift 4 medium.com中使用Multiple ViewController Swift 4中的多个ViewController(第2部分) 如何在Swift 4 medium.com中使用Multiple ViewController Pada part 1 kita telah berhasil membuat多视图控制器。 Pada第2部分Ini Kita Akan Menguji Apakah视图控制器Kedua Berfungsi Semestinya Atau Tidak。 Mulai Pembuatan Projek Pada langkah pertama kita阿肯mendrag kembali按钮pada视图控制器pertama ke视图控制器kedua untuk membuat segue。 Setelah kita drag akan ada penghubung antara视图控制器pertama dengan yang kedua。 伊西坎·纳玛(Isikan nama)标识符 标识符boleh diisi […]

实时编码的艺术

人们经常将实时编码与灾难的后果联系起来。 出于这种信念,大多数演示者在演示过程中都远离现场编码,而倾向于幻灯片,因此很安全。 我从事演示文稿的现场编码已有十多年了。 我几乎所有的演讲都是现场编码会议。 实时编码确实需要一定的勇气和信心,但是如果执行得当,它可以创造奇迹。 在这篇文章中,我将讨论我在现场编码演示中学到的课程。 实践 这毋庸置疑,多练习,多练习。 实践是完美的,良好的实践无可替代。 您应该确切地知道您要演示的内容以及演示流程将如何展开。 即使您是该技术领域的专家,也请确保您练习演示文稿。 后备 备份正在运行的代码总是一个好主意。 希望您的现场演示会顺利进行,但是如果您忘记了某些内容,则始终可以查阅备用代码。 少量代码 这是一个出色的实时编码演示的本质。 没有人正在参加您的演讲以看到您输入文字。 确保键入少量代码以产生输出。 理想情况下,您只需输入4-5行代码就能展示演示的一部分或一部分。 卡住,继续前进 如果卡在无法正常工作的代码上,请查阅备份。 如果您无法在10秒内使用备份修复它,请继续。 不要站在观众面前尝试解决问题。 您尝试解决问题的每一秒钟对您的听众来说都是永恒的。 不接受请求 我不确定这在世界其他地区有多普遍,但是在休斯敦这很普遍。 有时,您会在谈话中遇到一个人,他会在您进行实时编码时不断要求您添加功能。 与这些人打交道的最好方法是,简单地告诉他们在谈话后即可使用该代码,并且他们可以自由地自己添加功能以作为练习。 以后的问题 有时,您有很多演示要演示,而您根本无力回答演示过程中的所有问题。 在这种情况下,最好在演讲开始前告诉听众成员您将在提问的最后,甚至在会议结束后都可以帮助您。 为世界末日做好准备 如果您的演示需要互联网连接才能正常工作,请确保您有某种备份,以防没有互联网连接。 通常,最好录制一小段正在运行的演示的视频,以防SkyNet破坏整个互联网。 在会话/演示期间进行实时编码并不容易。 这是没有多少人这样做的主要原因。 成功的现场编码会议需要特殊的技能,信心和勇气。 最后,我认为实时编码是一门需要大量实践才能发展的艺术。 您是否在演示文稿中使用代码? 我很想听听您的提示!

雨燕数据

Tipe data merupakan salah satu hal yang penting sekali untuk di mengerti di luar kepala。 Kenapa,karna semua berawal dari situ ketika kita memprogram。 Kita harus benar-bear memahami apa tipe数据来源,bagaimana mengolahnya,dan bagaimana menggunakannya。 内置于Swift的yang ada的Berikut tipe数据: // 整数 var myInteger:Int = 1 //双 var myDouble:Double = 1.23456 //浮动 var myFloat:Float = 1.23 //字串 var myString:String =“世界你好!” […]

应用数据流:第一部分

与商店合作 示范代码 在我们陈述之前,如果您在标题中看到商店,并认为这与商务应用程序有关,那么不幸的是,事实并非如此。 在这种情况下,Store是针对组织用于应用程序的数据的存储和检索的特定方式。 好的,既然我们已经解决了这个问题,那么今天我们将要讨论应用程序数据流。 虽然这个主题听起来可能并不超级有趣,但是从长远来看,很好地处理流经应用程序的信息流将为您节省大量时间。 乱序 在开始构建之前,您多久坐下来勾勒出一个应用程序的大致轮廓? 经常? 一点也不? 如果是定期的,那么有多少时间用于映射数据和应用程序状态,以及有多少时间在计划UI上? 事实是,花时间计划数据的人并不像在UI上那么多。 为什么不呢?有很多很棒的工具,例如Sketch,可以用来计划UI,还有很多博客和其他资源,可以用来学习更多有关计划UI的信息。 计划数据并不是乐趣的一半。 但是,如果您做得正确,花时间去做将为您节省两倍的麻烦。 组织混乱 如果您考虑一下,那么一开始没有太多经验并在iOS中使用MVC作为指导的人可能会以多种方式构造代码。 没有什么限制甚至路标可供他们遵循。 清晰可见的路标通常像救生筏一样被抓住。 这就是为什么这么多的初学者代码最终出现在ViewController中,尤其是viewDidLoad中的原因。 没有太多其他参考,这成为他们的组织原则。 开放的画布 除了基本UI类的实现之外,作为程序员,您几乎没有做出任何决定。 刚开始时,打开的画布通常是挫败感的源头,因为在那个阶段,您真的想知道应该去哪里。 但是,有了这个自由空间,您会感到更加舒适,这为您提供了一个探索的好地方。 MVC 对于此示例,我们将使用接近普通MVC的内容进行处理。 过去,我必须承认,我对iOS使用的标准MVC抱有不必要的苛刻意见。 主要是由于我自己的不耐烦。 只要有一点时间,加上适当的实现,MVC就能很好地工作。 尽管在演示项目中有视图模型,但是代码没有什么特别的花哨,没有RxSwift,也没有协调器。 出于所有目的和目的,它都是原始的MVC,因此tableview单元模型的结构如下: 数据流 在继续之前,我只想澄清一个术语:数据流。 当我指的是应用程序中的数据流时,我指的是如何将数据从源头传递到应用程序以进行显示以及其结构。 它涵盖了从API响应到数据模型乃至数据呈现的所有内容。 就其重要性而言,它并没有获得应有的价值。 我愿意打赌,当我第一次学习网络电话并开始构建更复杂的应用程序时,我经常会遇到很多麻烦,这是因为我并没有真正考虑数据将通过应用程序的方式。 希望它将变得更加清楚演示代码的重要性。 同步器 同步器是一个类绑定协议。 实施后,它将允许您的控制器预订正在更新数据模型的对象。 这样,它就可以采取相应的行动。 在我给出的示例中。 当数据模型添加新项目时,将通过其与Synchronizer的订阅来通知控制器。 然后,它可以同步数据和视图。 同步 同步维护控制器和更新数据的对象之间的连接。 当您认为数据已完成更新时,将发送同步消息。 这可能在API调用或CoreData提取的末尾。 商店 商店协调流程并保存数据。 在基本形式中,它只是定义某些特征的协议。 当您针对特定数据和任务实施它时,它将变得很有用。 物品商店 […]

iOS面试问题(快速)-第3部分

1.什么是封闭,我们可以在哪里使用? 它们是自包含的代码块 ,可以在代码中传递和使用。 Swift中的闭包类似于C和Objective-C中的块以及 其他编程语言中的lambda 。 它们与函数几乎相同,但不一定具有名称。 无需声明每个参数的类型,如果这样做,则无需声明闭包的返回类型。 单击 链接 以了解所有类型的闭包语法。 2.什么是转义/不转义闭包? @nonescaping闭包:(默认闭包) 当在函数的参数中传递闭包时,请在函数主体执行并返回编译器之前使用它。 当函数结束时 ,传递的闭包超出范围,并且在内存中不再存在。 @转义闭包: 。 在函数的参数中传递闭包时,请在函数体执行并返回编译器后使用它。 当函数结束时 ,传递的闭包的作用域存在并存在于内存中,直到执行闭包为止。 链接 3. 提到Swift中可用的集合类型是什么? 数组 -用于按顺序存储相同类型的多个值。 集 -用于以无序方式存储相同类型的不同值。 字典 —用于以无序方式存储具有键-值对关联的值。 4.如何在Swift中定义基类? 在Swift中,这些类不是从基类继承的,并且您在未指定其超类的情况下定义的类将自动成为基类。 5.什么是反初始化器以及如何用Swift编写? 在取消分配类实例之前立即声明一个反初始化器。 您使用deinit关键字编写反初始化器。 如果需要在取消分配对象之前执行某些操作或清理,请使用它。 例如 ,如果您创建一个自定义类来打开文件并向其中写入一些数据,则可能需要在释放该类实例之前关闭该文件。 反初始化器的编写没有任何括号 ,并且没有任何参数。 deinit { //执行反初始化 } 6.双重问号“ ??”有什么用? ? 该运算符称为nil合并运算符 。当可选参数为nil时,我们使用它来提供默认值。 let a: String? = nil let […]

Apple Swift套件管理员:深入研究

苹果已经发布了自己的软件包管理器,称为“ Swift Package Manager”,以共享和分发Swift软件包。 很高兴知道Apple正在努力替代iOS开发世界中当前最受欢迎和最讨厌的软件包管理器,即CocoaPodsand Carthage。 在本文中,我们将介绍软件包管理的基础知识,并深入研究iOS中的软件包管理,尤其是Swift Package Manager。 当前的iOS软件包管理器 大多数现代语言都带有用于代码分发的官方解决方案,例如Ruby的RubyGems,PHP的Composer,NodeJS的NPM。 在iOS开发环境中,开发人员必须依赖第三方依赖项管理工具,例如CocoaPods和Carthage。 iOS中的程序包管理器还有另外一项工作,即在下载之上构建代码。 在动态框架的情况下,程序包管理器应该能够下载并构建框架。 您可以在此处阅读有关iOS静态和动态库的更多信息。 让我们简要地看看它们是如何工作的。 我们将使用’SwiftyJSON’这是非常流行的Swift库来解析JSON作为示例。 可可豆 CocoaPods作为Ruby库提供,需要作为RubyGem安装。 CocoaPods是使用Ruby构建的,并且可以使用OS X上可用的默认Ruby安装。 $ sudo gem install cocoapods 可以使用“ pod init”命令初始化CocoaPods,该命令将创建模板Podfile,但我们可以创建自己的简单“ Podfile”。 典型的“ Podfile”将如下所示 平台:ios,“ 8.0” use_frameworks! 以“ MyApp”为目标 pod’SwiftyJSON’,’〜> 2.3′ 结束 现在,我们可以使用魔术命令下载依赖项 $ pod安装 CocoPods和Xcode 上面的命令(pod安装)非常神奇,它可以对我们的Xcode项目进行很多更改。 在大多数情况下,很难理解发生了什么变化。 这可能是大多数开发人员讨厌CocoaPods的原因。 CocoaPods对Xcode进行了以下更改。 .xcworkspace文件(.xcodeproj顶部的另一个文件,用于打开项目) Podfile.lock(CocoaPods的锁定版本) “ Pods”目录(目录包含Pod依赖项的源代码) Xcode设置中有很多东西! 现在,我们必须使用.xcworkspace打开项目以导入您的依赖项,否则CocoaPods无法正常工作。 CocoaPods的优缺点 […]

在iOS中设计实体层次结构:类继承v组成

设计不佳的实体层次结构可能像这座塔一样不稳定。 不灵活的设计可能无法接受新的实体或特征,并且可能导致大量的代码复制和粘贴。 层次结构中更下层的实体可能会导致不必要的行为或意外的实现,并且大量的覆盖可能导致较差的动态调度。 简而言之,正确设计很重要! 设计这种层次结构有两种常用方法: 类继承 和 组合 ,您可能会惊讶地发现一种方法明显优于另一种方法。 在本文中,我们将使用这两种方法设计一个简单的层次结构,以讨论它们的优点和缺点。 让我们开始吧! 方法1:类继承 类继承是在OOP中设计实体层次结构的经典方法,即使是初学者,也将很快熟悉本节中的概念。 作为一点点回顾,让我们提醒自己,继承是一种基本行为,已植入到类中,但未在结构中找到。 出于本文的目的,我们将构建以下层次结构的代码表示形式: 在代码中,它看起来像这样: 在这种情况下,不能将任何功能放在Bird超类中,因为它们都不是所有四个Bird子类都通用的。 相反,我们有不同的组合。 为了使这些功能在需要的地方可用,我们被迫做这样的事情: 即使一眼就能看出这是一个糟糕的解决方案,原因有几个。 首先,有很多重复,将相同的方法实现复制到不同的类中。 试想一下,如果我们需要对这些方法之一进行更改,那么现在我们需要在多个位置进行相同的更改。 接下来,它也打破了单一责任原则。 就Puffin而言,我们在单个类中实现了所有三种方法。 为了代码的可维护性,我们理想地希望看到封装在不同实体中的这些不同职责。 有人可能会争辩说,可以通过一些“创造性”子类来减少复制的数量,但这不可避免地导致了继承杂耍行为,这种行为只会随着新方法的引入而变得更加复杂,或者新类仅需要某些继承的方法而变得更加复杂。 。 我们最终得到了一个非常脆弱的层次结构,在该层次结构中,超类的单个更改可能在继承链的更下方产生无法预测的结果。 除此之外,当我们查看开始的层次结构图时,我们被提醒,我们的理想是将所有鸟子类都置于同一级别,这是用这种方法无法实现的。 那么为什么类继承不能给我们想要的结果呢? 构架此讨论的一种有用方法是考虑“是”与“具有”的关系。 类继承仅限于表示“ is-a”关系:很好地描述了海雀 “ is-a” Bird和Bird “ is-a(n)” Animal 。 但是,当我们尝试表示“具有”关系时,通常会达不到要求。 在这种情况下,我们可以将“具有”表示为一种属性(“具有喙”)或一种方法(“具有飞行能力”)。 我们看到想要添加swim() , walk()和run()的功能未在我们的鸟子类中一致地应用,这并不罕见。 在您脑海中越是用“ is-a”和“ has-a”观察世界,您就越会意识到自然世界并不是那么容易装箱。 方法2:通过协议组成 因此,现在让我们通过合成解决相同的问题。 以下方法由四人帮提出,用一种优雅的方式描述了这种方法: 编程到接口,而不是实现。 在iOS中,我们通过使用协议定义接口。 任何采用协议的实体都必须在合同上遵守所要求的接口,这实质上就是上述短语要求我们执行的操作。 现在,我们的基本设置如下所示: […]

Swift中的字符串,字符和性能-深入探讨

扫描令牌所用时间的三分之二全部花在了用于Character类型的初始化程序中。 到底是怎么回事? 初始化程序的第一个参数标签提供了一个小提示: _builtinExtendedGraphemeClusterLiteral 。 注意单词“ literal”。此初始化程序不用于从我要遍历的字符串中提取Character值; 它用于从源代码中其他地方的文字文本创建Character值。 在nextToken下找到这些标记的唯一地方是我的令牌生成器的switch/case模式。 他们真的造成那么多的开销吗? 我们可以让Swift编译器使用-emit-sil选项发出“规范SIL”(Swift中级语言),以更仔细地了解如何将这些case模式编译为较低级的代码。 (我在存储库中包含了一个小脚本,该脚本可以执行此操作,并且还可以分解Swift符号。)让我们找到与匹配逗号字符的case模式对应的SIL(为简洁起见,重新格式化了行号和范围): %448 = string_literal utf8“,” %449 =应用%26(%448,%23,%24,%25): $ @ convention(method) (Builtin.RawPointer,Builtin.Word, Builtin.Int1,@ thin Character.Type)-> @owned字符 %449的第二行和第三行所示的方法签名%449其放弃,但我们可以通过查看值%26来确认它,该值是被调用的函数: %26 = function_ref @ Swift.Character.init( _builtinExtendedGraphemeClusterLiteral:Builtin.RawPointer, utf8CodeUnitCount:Builtin.Word, isASCII:Builtin.Int1)-> Swift.Character : $ @ convention(method)(Builtin.RawPointer,Builtin.Word, Builtin.Int1,@ thin Character.Type)-> @owned字符 这是什么意思呢? 这意味着, 每次通过扫描循环(即,针对字符串中的每个字符)时,Swift都会调用此初始化程序来创建case模式中的每个字符,以便将当前字符与该模式进行比较,直到找到匹配项为止;并且该初始化程序如果您习惯于字符类型实际上只是一个数字代码单元的语言,则它的成本将大大超出您的预期。 通过查看Swift标准库源代码,我们可以看到将字符串文字(例如”,” )转换为Character时发生的动作序列: 编译器将UTF-8编码的文字表示形式嵌入可执行文件的数据段中。 在使用文字的地方,Swift调用Character.init(_builtinExtendedGraphemeClusterLiteral:utf8CodeUnitCount:isASCII) , Character.init(_builtinExtendedGraphemeClusterLiteral:utf8CodeUnitCount:isASCII)其传递步骤1中嵌入的字符串数据的地址(源)。 反过来,此初始化程序在String上调用相同的初始化程序。 最终,分配了StringBuffer […]