Tag: swift

Objective-C与Swift:您应该从什么开始?

一方面,Swift从一开始就告诉我们,他非常容易理解,另一方面,Objective-C具有自己的高输入阈值,对于初级程序员而言有时可能很难做到。 如果您对制作自己的应用程序的兴趣太大了,那么您会遇到一个问题-应该使用哪种编程语言:新的Swift或经过时间考验的Objective-C? Objective-C与Swift:让我们看看吗? 让我们看一下使用不同语言的相同代码的一些原始示例: 如果要初始化大量,则在Objective-C中您应该这样做: 在Swift中: 当然,即使在原始代码中,您也会看到比Objective-C更快,更易理解的语言。 让我们看看如果我们要制作像“ Hello World”这样的程序会怎么样 目标C: 迅速: Objective-C具有自己的特定且困难的语法,并带有大量不同的标记。 Swift更清晰,而且类型具有防御性,因为如果您忘记打印变量类型,则不必担心。 但是,如果您是初学者,则应该知道在何处使用哪种类型。 Objective-C与Swift:为什么我需要这个? 重要的是,您打算做什么以及需要什么? 让我们来看看每种语言的优缺点! 工作方式: 几年前,当Swift发行时,您不知道Objective-C就找不到工作,因为所有公司都在Objective-C上对其应用程序进行编程,因此很难将Swift实施到Objective-C中。 今天,一切都变了。 所有公司都知道Swift是一种快速发展的语言,并开始在其应用程序中使用它。 另一个非常重要的时刻是稳定性。 Objective-C已经使用30年了,而不是只有4岁的Swift。 当然,例如,您不能在新程序中使用Swift的早期版本,因为它相差太多,这在Objective-C上无法说清楚。 您可以使用已有5年历史的代码,它将可以正常工作。 为了娱乐: 如果您不想在公司工作,并且计划快速而轻松地制作自己的应用程序,那么您需要Swift。 Swift中的代码简洁明了,这降低了初学者的入门门槛。 但是不要放松。 由于进入门槛低,Internet充满了不合格代码。 因为许多人在没有必要的知识的情况下开始进行编码。 好吧,如果我们总结一下-Swift适用于最新的应用程序以及快速轻松的入门。 Objective-C是旧平台的工作和支持所必需的,但是很难研究它,但是该选择什么呢? 这个问题没有确定的答案,但是我试图让您考虑您的优先事项,这应该有助于确定。 一些材料来自:https://goo.gl/nJ5hnG

快速跳入设计模式

我们什么时候应该使用它? 当有一个以上的班级实例时会引起问题。 单例模式意味着在任何时间我们只能创建该类的一个实例/对象。 此模式阻止创建多个实例。 我们使用 Apple的 次数很多次 基础 API, 例如: UserDefaults .standard UIApplication .shared FileManager .default 示例:#1 这称为True Singleton或称为default 示例:#2 这与真正的 Singleton非常相似,我们将init声明为public ,从而允许创建其他实例 示例:#3 LocationService 我们应该注意些什么? 如果您只是试图将信息从一个视图控制器传递到另一个,则单例不适合 “单身人士有问题的最常见原因是测试” 在Swift中避免单身人士 单例要点: 单例模式将一类限制为仅一个实例。 注意过度使用此模式! 在创建单例之前,请考虑其他方法来解决该问题。

>>按位移位(swift 3)<<

高级运算符“ <>”用于快速将整数位移位给定的次数。 向右移一点具有将整数减半的效果,而向左移则使整数加倍。 例如: //右移 让example1 = 8 >> 1 // example1 == 4 让example2 = 8 >> 2 // example2 == 2 //向左移动 让example3 = 8 << 1 // example3 == 16 让example4 = 8 << 2 // example4 == 32 要了解移位的情况,我们首先需要了解整数如何用二进制表示。 在此示例中,我将使用一个无符号的8位整数来演示其工作原理。 了解UInt8 我在示例中使用的是UInt8,因为它很容易理解,因为我们不处理负数和仅8位。 注意 :拥有带符号的整数基本上意味着二进制签名中的一位被用来表示整数是正数还是负数。 意味着我们只剩下7个位来定义一个数字。 这使移位变得更加复杂。 在无符号整数中,所有8位都可用于定义数字。 用8位数字表示一个数字意味着我们可以表示256种不同的可能性(0–255)。 0 = 00000000 […]

占位符介绍

在UITextField上设置多个占位符并UITextField设置动画 占位符是一个源远流长的功能强大的概念-易于被用户识别,具有严格,合理的含义,并为开发人员提供了一种提示用户的简便方法。 但是,有时仅拥有一个占位符是不够的。 有时您想向用户展示可以输入的所有内容。 例如,如果您有一个名为“活动标题”的字段,那么您当然可以在其中将“运行”作为占位符。 或者,您可以定义一组占位符,例如“运行中”,“行走”,“行进”,“拳击”,并对它们进行动画处理。 如果认真使用此技术,则可以提供出色的用户体验。 看起来像这样: 占位符库允许您做到这一点。 实际上,它确实非常简单,我鼓励您自己尝试实现类似的东西-它可以很好地介绍迭代器, CATransition和Timer (以前称为NSTimer )。 在本文中,我们将快速浏览API,然后讨论一些体系结构选择和功能。 在开始之前,这里是GitHub上的占位符 : 德雷蒙德/占位符 占位符–🅿️为UITextField定义多个占位符,并对它们的更改进行动画处理 github.com 现在让我们潜入吧! 如何使用 占位符旨在与视图控制器很好地配合使用。 API的核心部分是Placeholders类。 您可以直接创建它: let占位符=占位符(占位符:[“正在运行”,“正在行走”,“骑自行车”]) 这将创建一组三个占位符。 当然,通常您希望“循环”占位符,以便动画永远运行。 或者您想改组您的集合,以使用户不会每次都以相同的顺序看到相同的占位符。 为此,应分别使用.infinite和.shuffled选项,如下所示: let占位符=占位符(占位符:[“正在运行”,“正在行走”,“骑自行车”],选项:[.infinite,.shuffle]) 然后,在viewWillAppear方法中,应将Placeholder实例绑定到UITextField 。 您可以通过调用start方法来做到这一点: placeholders.start(时间间隔:3.0, fireInitial:正确, textField:textField, 动画:.pushTransition(.fromBottom)) ( fireInitial用于立即设置第一个占位符) 基本上就是这样! 现在,您有多个动画占位符。 您可以间隔播放或调整动画以适合您的需求。 如果要创建完全自定义的动画,请查看自述文件。 怎么运行的 总的来说,该解决方案非常简单:它是Timer ,迭代器和CATransition的组合。 数据源是通过AnyIterator提供的,占位符的更改是通过Timer安排的,并使用简单的CATransition执行。 如果您想知道动画的执行方式,则为: 让过渡= CATransition() transition.duration = 0.35 transition.timingFunction = […]

Swift:使用接口协议就像Objc中的“ .h”文件一样

与Swift一样,我也是Objective-C语言的忠实拥护者。 我完全同意使用Swift,我可以像小说一样在语法上创建代码,这对于代码可读性方面具有很大的优势。 但是,Objective-C中我最喜欢的功能之一是,它具有分离的头文件,该文件解释了特定类如何工作并提供功能。 因此,每当我需要使用3rd party模块时,我要做的第一件事就是打开头文件并浏览所有功能。 不幸的是,在Swift中,我经历了很多次,尽管所有的巨大代码都集中在一个类文件中。 我必须知道的一些代码,但是大多数代码是可忽略的。 对于那些想使用它的人,我该如何设计一个具有较高可读性的类? 这是一些建议; 使用// MARK:符号和接口协议。 我们开始做吧 假设我正在做一个ScheduleReminder,它使我想起每天早晨的整个时间表。 我可以设置一个带有两个整数值的小时和分钟的AlarmingTime。 这是一个简单的代码示例; 有两个属性,日程表将属性列表设置为public(实际上,默认访问范围为Internal,但在这里说是public),alarmingTime为私有。 它还具有用于添加,修改和删除计划的三种公共方法,以及两种作为私有的实用程序方法。 现在,我完成了并将这个模块传递给我的同事。 当我的同事第一次提供此模块时,可以期望采取什么措施? 当然,他会仔细阅读所有代码并找出可以使用的可用功能。 幸运的是,这个ScheduleReminder类只有很少的属性和方法,不需要花很长时间阅读所有代码,但是如果模块有成千上万行代码,该怎么办? 我很确定我们要在5分钟后才开会给他。 从可读性的角度来看,有一种可能的解决方案。 put // MARK:公共和私有功能之间的表示法。 这种方法有几个优点。 将具有相同访问范围的所有功能放在一起,其他开发人员可以轻松地找出该模块提供的功能,而无需阅读和理解所有代码。 这种方式的另一个优点是,您可以使用面包屑菜单一目了然地了解模块结构。 但是,使用// MARK:符号作为维护方面太脆弱了。 如果其他开发人员在代码末尾添加了公共功能怎么办? 如果在重构过程中将Modify函数更改为private函数怎么办?如果开发人员忘记将“ private”表示法放在必须私有的函数前面怎么办? 我们是否也每次都固定表示法的位置? 因为// MARK:表示法是一种COMMENT,所以它是维护自身的成本。 我可以选择的另一个选项是,使用协议在协议文件中指定所有功能。 我更喜欢将其命名为接口; 在此示例中,可以将其命名为ScheduleReminderInterface。 对于用例,将属性声明为ScheduleReminderInterface并对其进行初始化。 现在,我可以创建一个新的Swift文件并将协议代码放在其中,它将像Objc头文件一样工作。 使用接口协议的最大好处是,其他开发人员无需关心模块的时间和复杂程度,而只需弄清楚他们需要什么。 另外,由于ScheduleReminderInterface是协议,因此具有此接口的类完全不受ScheduleReminder类的代码更改的影响。 结论 提供接口协议是提高代码可读性和维护性的一种方法。 著名的话说“没有灵丹妙药”,这种方法不能完美解决所有问题,但可以认为,我们拥有更多的架构卡,可以更好地找到我认为的问题。

UITableView行选择-额外鲜味

很多时候,您都有一个UITableView并且想要选择一行。 最后,您将看到一行永久性突出显示的行,因此您尝试对其进行修复。 如果您想继续: 设置单个视图项目 将ViewController嵌入到UINavigationController 添加UITableView并在所有四个边缘上设置约束 使控制器成为tableView的dataSource和委托 将tableView的IBOutlet添加到您的控制器 添加具有居中图像的原型单元 将tableView的单元格高度设置为图像视图的高度 添加具有相同图像(或任何其他图像)的新UIViewController 设置从单元到新控制器的表演节目 添加一些代码以赋予tableView一些行。 完整的代码如下所示: 当您返回时,该单元格仍突出显示。 (注意:它本身并不会取消突出显示,这只是gif的时间。😔) 尝试在tableView(:didSelectRowAtIndexPath)修复此问题很诱人。 它可能看起来像这样: 您会注意到,返回tableView时,该单元格根本没有突出显示。 这似乎没什么大不了的,但它会改变您的应用程序的感觉。 UI详细信息就像鲜味,您无法用手指指着它,但是您知道它何时在那里。 在viewWillAppear(animated:)添加检查以查看是否选择了行。 如果是这样,请以与视图外观相同的动画速度取消选择它。 现在,整个ViewController应该如下所示: 顺畅得多。 像这样的小细节确实可以使您的应用脱颖而出。 😀如果您认为这有帮助,请通过。

Xcode 9的动手XCUITest功能

注意:本文最初发布在我的个人博客上。 继续阅读此处,因为某些GIF尚未上传到Medium。 在WWDC 2017上,有一个关于“测试中的新增功能”的精彩会议,主要讨论XCTest和XCUITest框架的新功能。 苹果公司开发人员工具团队在使用XCUITest进行UI测试以及与Xcode Server进行持续集成方面进行了重大改进。 在本文中,我们将通过Xcode 9和命令行中的实际示例探索所有新功能。 探索过程中创建了Github存储库Xcode9-XCTest。 您可以将这篇文章引用到该GitHub存储库,以自己尝试一下。 宣布了许多与针对Apple平台(尤其是iOS和macOS)的测试有关的新事物。 其中一些如下。 XCUISiriService 本地化测试 异步测试 UI测试性能改进 活动,附件和屏幕截图 多应用测试 xcodebuild:无头测试 xcodebuild:并行测试 内置Xcode服务器 测试过程中有很多增强功能,包括Siri集成,XCTest中的Waiting,xcodebuild中的Core Simulators等。 让我们一一介绍。 XCUISiriService 使用XCUISiriService,我们现在可以与Siri界面进行交互。 我们可以通过传递来自XCUITests的语音识别文本来控制Siri,Siri将采取相应的行动。 想象一下,我们想使用XCUISiriService打开一个Apple News应用程序,我们可以从测试中做到这一点。 func testXCUISiriService(){ XCUIDevice()。siriService.activate(voiceRecognitionText:“打开新闻”) } 几个月前,当我与Xcode 8.3一起宣布使用XCUISiriService从XCTest控制Siri时,我写了一个详细的博客,它还在Github XCUISiriServiceDemo上创建了演示项目,但API语法有所变化,但示例仍然有效。 实际例子 在Xcode 9中打开Xcode9-XCTest项目,然后从Xcode9_XCTestUITests.swift文件运行testXCUISiriService()测试。 您可以看到Siri将打开Apple News应用程序。 本土化 使用Xcode 9,我们可以使用Xcode方案在不同的Language和Region中运行测试。 在编辑方案时,我们会看到“测试”选项,以使用特定的语言和区域运行测试。 通过更改方案设置,我们可以轻松地用不同的语言和地区测试我们的应用程序。 异步测试 在很多情况下,我们需要等到事情发生以进行测试执行为止,例如打开文档,等待服务器的响应等,但这在UI测试场景中最常见。 到目前为止,XCTest通过创建期望来处理异步测试,并且测试将一直等到期望得到满足。 XCTest超时将导致测试失败。 期望与XCTestCase紧密相关。 现在,XCTest具有新的类XCTWaiter,它使我们可以显式定义与XCTestCase分离的期望。 它具有作为公共API的初始化程序,然后涵盖了不同的等待条件。 XCTWaiter等待一组期望被实现。 我们现在可以这样定义期望: […]

本地化您的应用程序以支持多种语言-iOS本地化

为什么我们需要支持多种语言? 因为并非所有iPhone和iPad用户都使用英语阅读或书写。 在此博客中,我将向您展示使用Xcode和iOS API本地化应用程序并使其以多种语言提供的功能是多么容易。 本地化是使您的应用程序支持多种语言的过程。 Xcode具有对本地化的内置支持。 有人认为本地化只是在进行翻译,这是正确的,但是本地化还包括其他元素,例如图像,声音等。此外,您还必须处理不同数值,日期和时间的显示格式。 在开始本地化工作之前,请确保您对应用程序进行国际化。 国际化是使您的应用适应不同语言,地区和文化的过程。 由于可以在世界的不同地方使用一种语言,因此您的应用应适应一个人居住的地区和文化习俗。 使用基础国际化-将面向用户的字符串与.storyboard和.storyboard文件分开。 使用添加新的语言支持,在“项目信息”选项卡的“本地化”部分下单击“ + ”按钮。 然后选择您要支持的语言。 在这里,我们增加了俄罗斯的支持。 现在,您可以在.storyboard看到新语言 现在,我们必须导出在应用程序中用于翻译的文本。 为此,我们在编辑器菜单中有一个选项。 情节提要中使用的文本将自动导出。 对于控制器内部使用的文本,我们必须使用NSLocalizedString方法更改字符串。 一旦我们使用NSLocalizedString更改了字符串,Xcode就会自动为控制器内部使用的文本创建一个名为Localizable.strings的文件。 在导出本地化的结果中,我们将得到一个。 用于翻译的xliff (XML本地化交换文件格式)文件。 我们可以使用很多在线服务进行翻译和编辑。 xliff文件。 此外,我们还有用于xliff文件编辑的Mac应用程序。 例如: -Xliff编辑器 一旦您获得翻译。 来自转换器的xliff文件,您可以使用“编辑器”菜单中的“导入本地化”选项轻松导入到项目中。 此外,我们应该准备好代码以进行本地化。 首先,我们需要使用NSLocalizedString宏将面向用户的文本与代码分开。 在此示例中,我获得了警报标题,消息和按钮的本地化字符串。 让localizedTitle = NSLocalizedString(“ Welcome”,评论:“”)let localizedContent = NSLocalizedString(“感谢您下载此应用程序”,评论:“”)let alert = UIAlertController(title:localizedTitle,消息:localizedContent,preferredStyle:.alert )alert.addAction(UIAlertAction(title:NSLocalizedString(“ Ok”,comment:“”),样式:.default,处理程序:nil))self.present(警报,动画:true,完成:nil) 在开发期间和本地化之后,使用多种技术对您的应用程序进行本地化测试。 在Interface Builder中,使用伪语言预览用户界面。 使用不同的伪语言运行应用程序。 预览本地化 导入本地化之后,您可以使用界面生成器预览本地化 运行应用 您如何测试本地化字符串是否正确显示? […]

使用Objective C语言收集数据类型(数组/字典)

数组基于索引在单个变量中包含相同数据类型的多个值。 请注意以下有关Objective C语言的数组用法的要点。 数组适用于索引。 这意味着我们使用索引来插入(提取)删除(替换)数组中的值。 在这里,插入—获取—删除—替换是我们对数组执行的主要操作。 数组的第一个索引从0开始,然后从1开始到2,依此类推……。 目标C上有两种类型的数组。 使用Objective C语言在Xcode中声明NSArray和获取操作 使用Objective C语言在Xcode中声明NSMutableArray和所有操作(插入—获取—删除—替换) 这里NSArray / NSMutableArray = Datatype,arrCities = Variable,arrCities拥有3个字符串值:孟买为0索引,德里为1索引,艾哈迈达巴德为第二索引 字典基于键值包含任何数据类型的多个值。 请注意以下有关使用Objective C语言的字典用法的注意事项。 字典适用于键值对。 这意味着我们使用键来插入(提取)删除(替换)数组中的值。 在这里,插入—获取—删除—替换是我们对字典执行的主要操作。 目标C上有两种字典。 使用Objective C语言在Xcode中声明字典和获取操作 使用Objective C语言在Xcode中声明NSMutableDictionary和所有操作(插入—获取—删除—替换) 在此,NSDictionary / NSMutableDictionary =数据类型,diccMyInfo =变量,“ FirstName”是值为“ Verma”的键“ LastName”是值为“ Mukesh”的键 感谢您的阅读,请分享您的反馈。 另外,请通过以下网址订阅我的YouTube频道以获取YouTube教程:https://www.youtube.com/channel/UCWjT8XgKescscxlPbMSVzbQ

在没有Xcode构建系统的情况下构建iOS应用

(本文最初是为我的博客 vojtastavik.com撰写的 ) 尽管其名称听起来很吓人 ,但是构建系统只是一个常规程序,它知道如何构建其他程序。 作为iOS开发人员,您当然熟悉如何使用Xcode构建项目。 您转到Product菜单,然后选择Build ,或者使用, ⌘B键盘快捷键。 您可能还听说过Xcode命令行工具。 它是一组工具,使您可以使用xcodebuild命令直接从终端构建Xcode项目。 用于自动化流程(例如在CI上)的非常方便的事情。 不管您如何启动它,建筑物本身都是由Xcode的构建系统编排的。 我们是否可以在没有Xcode的构建系统的情况下复制构建过程并“手动”构建应用程序? 是否可以对生成的应用程序进行签名 ? 甚至将其部署到实际的iOS设备上? ⚠️ 免责声明 1⚠️ 这篇文章是关于什么的: 编写一个不可重用的脚本,以最简单的方式构建一个具体的iOS项目。 这篇文章的目的不在于: 编写一个复杂而通用的构建系统。 我让Xcode 10.0使用Single View App模板生成一个新项目,并将其命名为“ ExampleApp”。 这将成为我们将尝试“手动”构建的参考应用程序。 我所做的项目的唯一调整是在主(也是唯一的) ViewController添加带有🎉的UILabel 。 我还在项目的根文件夹中创建了build.bash文件。 我们将使用此文件作为实际的构建脚本。 不要忘记通过在终端中运行以下命令来使文件可执行: $ chmod +x build.bash ⚠️ 免责声明 2⚠️ 其应如何构建应用程序的完整“食谱”包含在其 xcodeproj 文件中。 本文不是关于如何解析和从中检索此信息。 为了本文的目的,我们将忽略项目文件。 为了使我们的生活更轻松, 我们将所有细节(例如项目名称,源文件或构建设置)直接硬编码到构建脚本中。 让我们从一些整理工作开始。 我们需要定义并创建在构建过程中将要使用的一组文件夹。 ################################################ ########### #build.bash […]