Tag: swift3

使用无构建测试,xctestrun和Fastlane加速iOS CI

PS:这篇文章最初发表在我的个人博客上; XCBlog 在这里 在WWDC 2016上,有一个关于“高级测试和持续集成”的精彩演讲,其中提到了XCTest Framework,Xcode-Sever和xcodebuild命令行工具中的许多新功能。 我们可以使用这些功能来加快iOS持续集成过程。 当前的iOS CI限制 在Xcode 8之前,我们必须在CI上运行单元测试和UI测试之前构建,编译和应用程序,这是正在运行的任务的重复。 分布式测试非常耗时,而且我们已经在每台机器上构建和编译源代码。 实际上,在CI Server上进行构建和编译需要花费大量的构建时间。 Xcode 8和xcodebuild功能 Xcode 8版本在“ xcodebuild”中购买了几个新功能,可以为iOS开发和测试过程增加很多价值。 “ xcodebuild”是用于从命令行构建,运行和执行我们的应用程序的命令行工具。 在Xcode服务器中使用。 Xcode 8现在在xcodebuild命令行工具中进行了一些改进。 测试构建 xcodebuild现在具有“ build-for-testing”选项,它像往常一样采用工作区方案和目标,但是最重要的是它将创建“ XCTESTRUN”文件。 我们只需要执行“测试构建”操作 $ xcodebuild -workspace -scheme -sdk iphonesimulator -destination’platform = iOS Simulator,name = ,OS = 10.2’构建测试 这应该构建用于测试的应用程序,并在DerivedData中创建xctestrun文件。 无需构建即可测试 xcodebuid还具有另一个名为“ test-without-building”的选项,在这里我们不需要提供工作区,而是指定XCTESTRUN文件,该文件将注入该文件并运行所有测试。 此功能对于分布式测试非常有用,因为我们可以在一台计算机上创建XCTESTRUN文件并分发到其他特定于测试的计算机。 为了使用它,我们可以在不构建的情况下将此选项指定为ru测试 $ xcodebuild -workspace -scheme -sdk iphonesimulator […]

XCFit:具有Swift 3.1和Xcode 8.3支持的iOS完整堆栈BDD框架

XCFit是Xcode中的全栈iOS BDD框架。 XCFit设置带有框架代码和目录结构的Xcode模板,这有助于我们开始使用BDD,而XCFit Swift Framework提供了许多预定义的BDD样式步骤,从而可以用更少的代码来实现自动化BDD。 您可以在Github上阅读XCFit的详细信息。 XCFit 4.0已发布,具有很多功能,简短的发行说明可在GitHub上获得。 让我们详细了解XCFit 4的新功能。 XCFit 4.0 XCFit 4.0是主要版本,对Swift框架进行了许多改进。 XCFit 4 .0具有以下主要更改。 支持Swift 3.1和Xcode 8.3 添加了对带有集成Cucumberish库的XCFit框架的迦太基支持。 为XCFit和Cucumberish添加了许多预定义步骤,以便我们可以将其直接用于我们的项目中。 通过将XCFit和Fitnesse模板分别放在不同的命令中来改进Xcode模板。 在Youtube上使用Video Demo改进了XCFit的README和Web页面文档。 让我们简要地看到新的变化。 Swift 3.1支持 苹果刚刚发布了Swift-3.1-dev快照,其中对XCTest框架进行了一些有用的更改。 您可以在DZone博客上的XCUITests中阅读有关新添加的类的信息。 基本上,XCUITest现在支持异步测试,并能够使用新类控制Siri。 苹果已经添加了XCWaiter类,以使XCFit能够更好地等待服务员。 XCFit 4.0是完全基于Swift 3.1构建的,您可以在Cocoapods上看到Swift版本。 这个想法是从XCFt 3.1开始完全支持XCFit Swift框架。 如果尚未安装Swift 3.1,则可能需要等到Swift 3.1公开发行版才能使用XCFit 4.0的新功能。 迦太基支持 XCFit Swift框架现在可以使用Carthage构建,以前它仅与Cocoapods一起使用,但是XCFit 4.0也为Carthage添加了支持。 XCFit依赖于Cucumberish框架,因此我们可以通过拉XCFit来获得这两个框架。 只需在项目根目录中的Cartfile中添加以下内容 Github“ Shashikant86 / XCFit” 现在,我们可以使用以下命令下载并构建框架 $ carthage更新—平台iOS […]

使用XCWaiter在Swift中进行异步iOS测试

苹果公司最近为开发人员发布了Swift 3.1开发快照和XCode 8.3。 XCTest框架中添加了几个方便的类,以为iOS和macOS应用程序启用异步测试。 在本文中,我们将看到如何使用XCWaiter执行异步测试。 Swift 3.1开发版 Xcode 8.3中提供了新添加的类,如果您具有Apple Developer Account,则当前可以下载该类。 您可以从开发者帐户的“下载”部分获得它。 Xcode 8.3需要macOS版本10.12及更高版本。 您可以下载大约4.​​52 GB的压缩XIP文件。 如果您已经具有以前版本的Xcode,请删除它或保留它,但是必须在Xcode DEVLOPER_DIR之间切换。 下载完成后,您可以解压缩文件以安装Xcode 8.3 beta,并等待Xcode和命令行工具的安装。 一旦使用所有命令行工具完全安装了Xcode 8.3,我们就可以将其拖到/ Applications路径中。 现在,我们必须通过运行以下命令来切换到新的Xcode版本 $ sudo xcode-select —切换/Applications/Xcode-beta.app/ 这将设置新的DEVELOPER_DIR,我们准备使用Xcode 8.3。 确保使用xcrun使用正确的工具链— find swift命令将显示您正在使用的当前工具链。 $ xcrun —快速查找 /Applications/Xcode-beta.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift 现在,请确保导出工具链并使用正确的Swift版本,此版本当前为Apple Swift版本3.1-dev。 您可以通过运行以下命令轻松地做到这一点。 $ export TOOLCHAINS = swift $ swift —版本 Apple Swift版本3.1-dev(LLVM 40fb70e1b6,Clang 658ce8b57d,Swift d6c7fe1067) 目标:x86_64-apple-macosx10.9 […]

适用于Objective C开发人员的30个Swift概念-扩展

因此,让我猜想,您曾经是iOS开发人员一段时间,或者自己是初级开发人员,与Objective-C一起工作,并且擅长于此,您不想在您的应用程序中使用其他任何东西,如果没有将代码放在方括号中,将无法想象您的生活。 如果是这种情况,则此博客文章适合您。 如您所知,Swift如今变得越来越受欢迎,招聘人员和公司都要求开发人员更加了解这种语言。 这是我在过去的采访中曾问过的一些主题与其他一些主题之间的简短混合,这将有助于使从Objective-C过渡到Swift的过程稍微容易一些。 1 —结构和类之间有什么区别? 结构和类之间最重要的区别之一是,结构是值类型,并且在代码中传递它们时总是被复制,而类是引用类型并通过引用传递。 而且,类具有继承,该继承使一个类可以继承另一个类的特征。 2 —值类型和引用类型之间有什么区别? 要扩展有关结构和类之间差异的答案,有必要了解值和引用类型之间的差异, 当您复制值类型时,它会将要复制的内容中的所有数据复制到新变量中。 它们是2个独立的事物,更改其中一项不会影响另一项。 复制引用类型时,新变量将指向与要复制的对象相同的内存位置。 这意味着更改一个将更改另一个,因为它们都引用相同的存储位置。 如果还不清楚,这是一个例子 3 —关键字“ mutating”在Swift中是什么意思? 我们无法在实现中直接更改值类型的值,只有在创建副本并将我们想要的值分配给新副本时,才有可能。 但是,如果要在实现中更改值类型,可以在函数声明之前使用“ mutating”关键字。它表示该方法将修改结构的值,从而允许编译器创建该结构的副本。 这是一个代码示例 4 —“静态”,“类”,“最终”关键字在Swift类型方法中意味着什么? 在类型方法中,这些关键字的意思是: static:在值类型(例如结构)中,此关键字表示方法在类型级别而不是在实例级别关联。 在引用类型中,这还意味着该方法在类的类型级别上关联,但也不允许该方法可为子类覆盖。 class:在目标C中创建类方法的方式,它们可以被子类覆盖。 final:它是方法中static的别名,但是您也可以在类声明之前使用它,以使其不可变。 对于类,通常总是使用“静态”来创建类型方法,只有在您的子类确实需要重写它时,才应使用“ class”关键字。 这是代码示例。 5 — Swift中的可选项是什么? 在许多语言中,当遇到数据缺失时,必须通过编写代码的另一条路径来处理它。 没有迹象表明数据不存在,因此在程序中的许多地方都必须编写防御性代码。 这不是Swift中的情况,可选类型是Apple处理应用程序中数据缺失的方式。 有关可选项的更多信息,请转到此处 6 — Swift中的let和var是什么? 在Swift中,var表示变量。 变量是可以更改或更改的对象。 另一方面,let表示常量,表示分配给对象的值永远不会更改。 设置完成后,就完成了。 当需要设置永远不变的值时,可以使用常量。 欲了解更多详情,请点击这里 7 — Swift中的元组是什么? 元组只是值的有序集合,出于我们的目的,它们将多个值分组为一个复合值。 为什么这很重要? 在Objective-C中,如果希望一种方法返回多个值,则有两个选择-返回一个自定义对象,该对象具有存储返回值的属性或将这些值粘贴在字典中。 […]

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 […]

CoreData和Swift 3

最近,我一直在研究一个简单的任务管理器应用程序。 我决定快点编写它,因为我不想使用任何Pod,所以我从心爱的Realm切换到了CoreData,这就是我们旅程的起点。 CoreData与Swift 3一起对我来说还很陌生,因此我想阅读文档,但仍在Swift 2.2中。 那里没有问题,StackOverflow肯定会救我! 好吧,事实并非如此简单。 我花了几个小时才能找到所有资源并使其正常工作。 因此,我现在正在编写本教程,以便您可以在一个地方找到我发现的遍布互联网的内容。 将CoreData添加到您的Xcode项目 答:简单的解决方案是在创建Xcode项目时仅选择CoreData。 Xcode将为您的AppDelegate文件添加所有必需的代码,还将为您创建.xcdatamodeld文件。 从这里跳到项目符号点2。 B.将CoreData添加到现有项目 这不是那么简单,但仍然很容易做到。 第一件事是打开您的AppDelegate文件,并在顶部导入CoreData 。 下一步是添加CoreData方法,如下所示: // MARK:-核心数据栈 懒惰的varpersistentContainer:NSPersistentContainer = { / * 应用程序的持久性容器。 这个实现 创建并返回一个容器,并已为 应用到它。 该属性是可选的,因为有合法的 可能导致存储创建失败的错误条件。 * / let container = NSPersistentContainer(name:“ tets”) container.loadPersistentStores(completionHandler:{(storeDescription,error)在 如果让error = error as NSError? { //用代码替换此实现,以正确处理错误。 // fatalError()使应用程序生成崩溃日志并终止。 尽管此功能在开发过程中可能很有用,但您不应在运输应用程序中使用此功能。 / * 出现错误的典型原因包括: *父目录不存在,无法创建或不允许写入。 *由于设备锁定时的权限或数据保护,无法访问持久性存储。 *设备空间不足。 […]

Swift 3中的闭包是什么? (第3部分)

继续第1部分,第2部分,这篇文章将是有关Closures的最后一篇,我们都可以肯定,它可以写成一整本书,只讨论Closures,所以我几乎没有触及任何表面。 这次我要谈的是: 速记参数名称 尾随闭包 速记参数名称 迭代数组的一种方法是使用forEach方法,在以下示例中,该方法将打印其内容: 闭包具有使我们简化代码的功能,而不必通过参数访问其值,而可以使用简写参数名称来访问它们: 您可能会注意到,我们省略了参数名称number甚至省略了关键字in ,并且我们正在通过名称$0访问闭包提供的值,以便减少代码并专注于代码中最重要的部分。 因此,即使闭包有更多的参数,速记名称也将被分配为$0 , $1 , $2 ,以此类推。 尾随闭包 假设我们有一个名为findInteger的函数(不用担心该函数的源代码在结尾),它将使用Integer数组根据条件搜索元素: 因此,在上面的代码中,我们希望获得第一个满足关闭条件的数字,即数字服务器。 我们可以看到我们在第二个参数上收到一个闭包表达式,但是有时像在这种情况下那样,表达式变长了,相反,我们可以这样做: 区别在于,首先我们不需要在函数调用中使用参数标签closure 。 其次,闭包表达式位于函数调用的括号之后,但它仍然是函数的参数。 这种简化方式称为尾随闭合。 让我们来看另一个例子。 这次,我们在Integer的扩展结构中使用了一种称为forEach (末尾的源代码)的方法,该方法将允许我们迭代数字上的数字,如下所示: 该代码本身具有解释性,但是关闭时间较长。 让我们应用一些尾随闭包 。 因此,在这里作为最后一个示例( findInteger function ),我们没有放置称为closure的参数标签,也没有包含括号。 如果闭包表达式是forEach方法中唯一的参数,那么我们也可以消除函数的调用括号。 当闭包表达式很长时, 尾随的闭包可以解脱 。 正如我提到的,示例中使用的方法的源代码: 如果您觉得该文章有用,请帮助我建议单击绿色的心形轮廓图标,以便我可以继续创建更多文章,非常感谢! 我要亲自感谢Bob和Victor激励我与我们的iOS社区分享我的Swift故事。 感谢您阅读我!

iOSDCで発表してきました「Swiftのこれまでの动向のまとめと逐渐のさらなる発展の期待」

iOSDCにて,発表しました🎉 iOSDCのスタッフの方に,良い写真をたくさん取っていただけました😋 iOSDC日本2016 iOSDC日本2016の公式フォトアルバムです www.flickr.com

SWIFT 3中的UICOLLECTIONVIEW,没有界面构建器。

集合视图类似于表视图,它们显示由自定义布局定义的单元格的集合,并且像表视图一样,它们必须符合协议才能显示数据和执行操作。 在本教程中,我们将创建一个看起来像网格的集合视图。 好吧,让我们潜入…… 让我们开始创建一个新项目,这次选择Swift。 现在,让我开始向您介绍将处理collectionView布局的类UICollectionViewFlowLayout。 创建一个新的Cocoa Touch文件并使其成为UICollectionViewFlowLayout的子类,添加此完整的实现,我将对其进行解释…… let innerSpace: CGFloat = 1.0 let numberOfCellsOnRow: CGFloat = 3 override init() { super.init() self.minimumLineSpacing = innerSpace self.minimumInteritemSpacing = innerSpace self.scrollDirection = .vertical } required init?(coder aDecoder: NSCoder) { //fatalError(“init(coder:) has not been implemented”) super.init(coder: aDecoder) } func itemWidth() -> CGFloat { return (collectionView!.frame.size.width/self.numberOfCellsOnRow)-self.innerSpace } override var itemSize: […]

Firebase身份验证

您好iOS工程师, 这是学习Firebase身份验证的好日子。 在我的第一篇文章中,我简要说明了身份验证及其在应用程序中的作用。 今天,我们将找到有关身份验证以及如何在应用程序中使用身份验证的更多信息。 什么是认证? 身份验证是授予用户访问操作系统的过程。 为了进行访问,用户输入其凭据,然后应用程序将该信息与数据库数据进行比较。 如果用户在数据库中,则他们可以使用该应用程序;否则,他们将被拒绝访问。 我们现在使用大量的应用程序,大多数(如果不是全部的话)都具有身份验证过程。 我希望您尝试一下,看看有多少应用程序要求输入用户名和密码。 该过程就是身份验证。 我们为什么要关心身份验证? 我们应该关心身份验证,因为它使我们作为开发人员和客户受益。 让我们考虑一下客户如何使用身份验证方法。 1.用户为应用程序提供新的用户名和密码。 2.该应用程序仅在数据库中为该用户创建了一个唯一的配置文件。 3.用户只能访问其数据。 这只是用户如何使用身份验证的基本概述。 大多数情况下,每个应用程序都像上面的列表一样工作。 用户可能会以不同的方式与某些应用进行交互,但这只是基本概述。 对于我们的开发人员来说,身份验证也是有益的。 让我们考虑一下为什么要使用身份验证。 1.身份验证有助于提高安全性,因为用户可以将数据保存到他们只能访问的数据库中。 2.当用户登录到应用程序时,我们将为该用户创建一个结构化的数据库。 3.因为我们可以将用户与数据相关联,所以管理应用程序的所有数据更加容易。 例如,假设我们有一个应用程序将图片存储在数据库中。 如果没有身份验证方法,我们将不知道哪个用户提供了上传图片。 拥有这些信息很重要,因为如果用户想查看他们上传的图片,我们将不知道,因为数据没有连接到任何用户。 通过身份验证,我们可以在该数据库中为该人创建一个唯一的ID。 用户每次上传任何图片时,都会将上传内容与该人的唯一ID相关联。 Firebase身份验证 我们了解身份验证的基础知识,因此现在我们可以讨论Firebase身份验证。 使用Firebase,我们不必从头开始创建我们自己的身份验证库。 我们可以使用Firebase形成的基础架构为我们的用户带来出色的用户体验。 我们可以在Firebase中使用三种身份验证方法。 三种方法是电子邮件和密码,服务和匿名。 1.电子邮件和密码是我们几乎每天使用的每个应用程序中看到的内容。 在使用大多数应用之前,要求您提供用户名和密码。 2.服务已经存在了一段时间。 您正在使用的应用程序将询问您是否要使用Facebook,Google,Twitter等进行登录。服务允许用户选择是否要使用其设备上已在使用的服务登录。 它使建立帐户的过程变得快速而直接。 3.匿名身份验证为用户提供了一个临时帐户。 如果用户稍后注册,他们仍然可以访问其数据。 哪些应用程序应具有身份验证? 我相信所有应用都将受益于身份验证。 就像我之前说过的,这是组织数据的绝佳方法。 您不想做的一件事就是无法保存您的数据。 身份验证是应用程序为用户创建初始数据的起点。 除非您有另一种获取数据身份验证的方法,否则它将是完成这项工作的最佳解决方案。 为iOS设置身份验证难吗? 使用Firebase并不难配置身份验证。 首先,您必须设置环境以将Firebase集成到您的应用程序中。 我确实创建了一个教程,向您展示如何在应用程序上设置Firebase。 您可以在此处找到视频。 在接下来的几天里,我还将创建一个有关如何在您的应用程序中设置身份验证的教程。 […]