iOS 11带来了许多新的酷功能,例如机器学习和增强现实。 因此,您可能需要测试这些功能或创建出色的应用程序。 但是,如果您注意到其中一些需要自定义相机并访问相机框架。 iOS有很多API,供我们访问设备相机,捕获图像并对其进行处理。 AVFoundation是您应该关注的框架。 由于此框架非常庞大,并且有很多方法可以实现所需的功能,因此我决定撰写有关以下内容的博客文章集。 创建自定义相机视图 从自定义相机拍照 使用录制视频 检测面部并扫描QR码 (如果您需要一些特定的东西,请在评论中问我。我将尝试写/学习此内容) 对于所有想跳过博客文章并查看实际代码的书呆子。 我被你盖住了。 这是Github回购。 请密切注意此仓库,因为我将在同一应用程序中添加所有功能,并且如果您想提高代码质量,欢迎PR /问题。 rizwankce /相机 sw swift github.com中的iDevices自定义相机
在Objective-C时代,处理错误的最常见方法是使用NSError实例。 一个可能失败的方法通常需要一个指向空NSError实例的指针,这样它才能在执行失败时以及返回时返回特定的错误信息。 然后,您将必须检查错误实例是否仍然为空。 然后使用erorr详细信息放在其userInfo ( NSDictionary )中,使用它们的代码 ( NSInteger )和域 ( NSString )区分这些NSError实例。 这种方法对许多Objective-C开发人员都有效,但存在一些问题。 首先,检查错误很容易被忽略/遗忘。 其次,开发人员可以选择不传递错误指针。 两者都可能导致不良行为,并且在最坏的情况下,还会导致应用崩溃。 此方法仍在Swift 1.x中使用。 处理错误的另一种方法是使用异常。 引发异常时,执行将暂停,并且堆栈跟踪会立即暴露出来或应用程序崩溃。 异常在运行时得到解决,这意味着当您与它们面对面时,您只会知道它们的存在。 引入ErrorType Swift 2.0中引入了ErrorType协议,该协议为开发人员提供了另一种错误处理流程。 许多数据类型都可以符合ErrorType协议,包括struct和class ,但是使用最广泛且可能是最理想的数据类型是enum 。 由于列举了这些错误,因此无需使用幻数就可以更容易地对其进行分类。 使用Swift强大的enum数据类型,也很容易通过错误传递值以提供更多上下文。 NSError符合ErrorType,但是从ErrorType转换为NSError会丢失几乎所有信息。 投掷 可能引发错误的方法用throws关键字标记。 抛出的对象必须符合ErrorType协议。 Cocoa和CocoaTouch初始值设定项现在使用抛出,而不是使用ErrorPointer导致失败( 初始化? )。 我们上面使用的示例的方法签名现已更改。 赶上试试 捕获模式现在是Swift中错误处理的核心。 现在要求将可能失败的方法放入do-catch块中。 调用这些方法需要在调用它们之前立即用try标记它们。 使用CustomError和methodThatMayFail()示例,调用用法如下所示。 当标有try的方法失败时,代码将立即进入相应的catch块。 请注意,在上面的示例中,可以使用简单的let语句检索通过CustomError放大的值。 开发人员被迫处理错误,从而导致更好的代码输出。 就像上面的示例一样,所有自定义案例都用通用捕获来处理所有其他错误。 请注意,不可能用尽所有ErrorType情况,因为任何抛出方法都可以抛出任何符合ErrorType的错误,因此总有必要进行通用捕获 。 还有其他方法可以调用失败的方法而不将它们放入do-catch块中,这是通过使用try标记它们! 还是尝试? 您只能使用try! 当您完全确定该方法不会失败时。 如果这样做,您可能会因为崩溃而使应用程序崩溃。 此模式也可以用来捕获开发人员错误。 […]
使用初始化注入创建PDFViewController 一旦将URL属性注入到PDFViewController中,它将是不可变的。 这就是为什么我选择初始化注入而不是属性注入和方法注入的原因 。 注入的唯一属性是pdfUrl ,其他属性( document和outline可以在init()期间设置,它们可以在本地类范围中访问。 pdfView显示的内容由document属性确定。 由于它永远不会改变,因此我还将通过init()对其进行分配。 ThumbnailView浏览页面 ThumbnailView是PDFKit中的一项非常出色的功能。 唯一需要做的就是将pdfView分配给它的pdfView属性。 然后就完成了! 没有代表,没有通知,没有更多设置!🎉 概述以浏览各章 要转到某个页面,我们需要告诉pdfView转到某个PDFPage 。 因此,我们需要深入研究document中outline的层次结构以获得所需的page 。 由于我将UITableViewController用作popOver ,因此需要: 创建一个协议,以使PDFViewController符合它。 添加一些委托方法以访问pdfView中的PDFViewController 。 当用户选择某个单元格时,调用委托方法。
我们很早就决定建立一个APT存储库,以使人们可以轻松地在Linux上安装Swift和我们的Vapor Toolbox。 长期以来,它很快就被构建起来,但是它的确意味着很难维护。 展望未来,我们最近发布了APT 2.0版。 它是完全开源的,能够使我们的社区更紧密地融入流程。 我们是一家非常注重开源的公司,主要是因为我们的公司基于开源。 这也确实意味着我们拥有社区构建工具,这些工具可以从我们在APT上的工作中受益,并将工具放置在同一位置。 为了简化此过程,所有软件包现在都位于GitHub上,并且一旦批准,我们将使用CI系统在APT上构建新版本。 这个过程很简单。 用户在新的PullRequest中将基于某些模板的包推送到GitHub。 为了确保我们保持安全性,管理员需要进入并查看PR。 如果获得批准,则管理员只需向PR回复/approved ,之后,我们将运行一个Jenkins实例,它将获取更改,并启动一个Vapor CLI应用程序,该应用程序负责构建APT。 完成后,Jenkins将通过我们的vapor-ci-robot用户进行报告,并提供状态和日志链接 我们当然要添加很多东西,其中一项是我们现在正在构建的,并且令人兴奋的是,该工具可以自动测试新PR的建立和设置是否正确,这意味着我们将在沙盒环境中进行构建和设置。 完成所有工作后,管理员便可以批准该应用程序,知道是否一切正常。 我们还计划能够构建到目标操作系统。 这将为自动构建系统增加更多的灵活性。 只需访问http://github.com/vapor/apt,这里还有有关如何通过Linux上的APT安装Swift和Vapor的文档。 APT只能用于安装Swift,因此它不仅意味着可以与Vapor一起使用,而且还可以与其他服务器端Swift框架一起使用。
如果您想查看本系列的上一部分,请点击以下链接: 我的第一个Swift App 简介 medium.com 是的,做了介绍。 让我们开始吧! 我将从在Xcode上创建一个单一视图应用程序开始。 文件>新建>项目 选定的单视图应用程序 选择Swift作为主要语言 就是这样,项目已创建。 现在,我将创建一个git存储库。 https://github.com/ 创建一个新的仓库 使用项目目录上的终端: git初始化 git commit -m“第一次提交” git remote add origin git@github.com:用户名/repo.git git push -u原始主机 至此,我创建了一个.gitignore并在上面添加了一些临时文件,例如xcuserdata和.DS_Store。 忽略文件–用户文档 有时,有些文件不希望Git签入GitHub。 有几种方法可以告诉Git哪个… help.github.com 现在,让我们开始cocoapods。 荚初始化 在项目上启动cocoapods之后,是时候在podfile上添加第一个pod了。 使用以下命令安装pod: 吊舱安装 现在,我创建了一个开发分支以开始工作。 git checkout -b开发 如果您在处理git分支时遇到问题,这是一个很好的入门指南,这是组织它的好方法。 引入GitFlow GitFlow是由Vincent Driessen创建的Git分支模型。 它吸引了很多关注,因为它是… datasift.github.io 而已! 已创建项目,已安装所有内容,准备开始编码! 🙂 在下一篇文章中,我将创建服务管理器文件并使用SPTrans API对应用进行身份验证。 非常感谢!
表中的内容: 在项目中包括提供商 创建PostgreSQL配置文件 将PostgreSQL提供程序导入项目 将提供者添加到Droplet并查询数据库 在项目中包括提供商 在https://github.com/vapor上搜索提供程序存储库。 在文件Package.swift中包含该URL vapor / postgresql提供者 postgresql-provider-Vapor Web框架的PostgreSQL提供程序。 github.com 创建PostgreSQL配置文件 创建新的机密文件夹。 创建新的postgresql.json文件并介绍配置数据。 { “主机”:“ 127.0.0.1”, “用户”:“ manuelbordallo”, “密码”:“”, “数据库”:“ manuelbordallo”, “端口”:5432 } 将PostgreSQL提供程序导入项目 将库导入main.swift文件 导入VaporPostgreSQL 将提供者添加到Droplet并查询数据库 使用PostgreSQL提供程序更新Droplet初始化。 获取PostgreSQL驱动程序实例。 查询数据库。 让drop = Droplet( 提供者:[VaporPostgreSQL.Provider.self] ) drop.get(“ version”){在 如果让db = drop.database?.driver as? PostgreSQLDriver { let version =试试db.raw(“ SELECT version()”) 返回尝试JSON(节点:版本) }其他{ 返回“无数据库连接” […]
Scala中有Cake Design Pattern来进行依赖注入(DI),还有一个称为Minimal Cake Design Pattern的最小版本。 我们实际上并不需要在Swift中进行DI的框架。 仅使用纯Swift代码,我将向您介绍如何使用最小蛋糕设计模式在生产和测试代码上进行DI。 每个类都需要接口和实现 对于每个类,我将使用协议创建一个以Uses…开头的接口 ,并使用以MixIn…开头的类创建一个Implementation 。 接口仅声明协议可以做什么,而实现则声明如何 。 协议UserRepository { func findById(id:Int)->用户? } //接口 协议UsesUserRepository { var userRepository:UserRepository {get} } //实现 类MixInUserRepository:UserRepository { func findById(id:Int)->用户? { 返回用户(id:id,名称:“ orakaro”,角色:“ member”) } } 当UserRepository的实例被另一个类(例如UserService)使用时,我将使用上述Interface来声明新的配对协议/扩展,当然还要声明UserService本身的另一个Interface和Implementation。 听起来比它复杂。 让我们看一下代码。 协议UserService:UsesUserRepository { func Promotion(asigneeId:Int)->用户? } 扩展UserService { func Promotion(asigneeId:Int)->用户? { Guard var asignee = userRepository.findById(id:asigneeId)else […]
类型转换是一种出色的工具,可帮助实现OOP(面向对象编程)。 类型转换是检查实例类型的方法,|| 将该实例视为与其自身类层次结构中其他地方不同的超类或子类。 Swift中的类型转换使用is和as实现? / 作为! 操作员。 这两个运算符提供了一种简单而富有表现力的方式来检查值的类型或将值转换为其他类型。 但是,我们将仅专注于吗? 和! 如? :预期元素的可选。 如果要实现这一点,我们会说:“嘿,我不确定所说的元素是否属于这种类型。 如果不是,则返回nil并且不要使我的应用程序崩溃。” 如! :强制展开元素的可选。 如果要实现这一点,我们会说“嘿,我确定这个元素是这种类型的,我不需要返回nil,因为它将起作用。” 投射仅通过两种方式起作用: Down Cast:从父类转换为子类。 快播:从子类到父类。 上投: 在此示例中,我创建了两个类。 父类:人类,具有子类(成人)。 我创建了👩🏾,并将其设置为Humans,其子类为Adults。 从这一点开始,无论类型如何转换? 要么 ! 将起作用,因为父类型为Humans的is。 但是,当我们看待我们设定为重视人类的要素时,有一个警告, 但却是一个好警告。 不,严重的是,此错误仅警告我们:从成人到成人的有条件强制转换将始终成功。 因此[!]运算符与否,我们知道这将毫无错误地发生。 下调: 在此示例中,我创建了三个类。 超级类:人类,子类:成年人,子类:TinyHumans。 当我尝试给它键入Adults时,它仍然以TinyHumans的形式返回。 但是,一旦我将值更改为Adult并尝试将其类型转换为原始类型并将其子类化,则返回nil。 哦,是的! 当我申请为! 在我的代码中,它显然给了我一个错误,我们知道会发生错误,因为? 返回零。 所以不要以这样沮丧的年轻人而结束….. 我们将用作? 永远永远解决我们的类型问题。 如有任何疑问或意见,请输入Google! 😀
什么是纯函数? 纯函数是仅依赖于其参数的函数,并且其唯一可观察到的输出是返回值。 给定输入,纯函数将始终求值为相同的输出。 换句话说,它们是独立的且无状态的。 纯函数是没有副作用的函数。 副作用是,在函数范围内声明的某些值在函数内部发生了变异。 函数doubleNumbers()是函数的示例,因为它修改了在函数范围之外声明的数字。 由于doubleNumbers()不是纯函数,因为它依赖于外部状态。 类DataStore { 变数= [Int]() func doubleNumbers(){ var doubledNumbers = [Int]() 用于self.numbers { 让doubledNumber =数字* 2 doubledNumbers.append(doubledNumber) } self.numbers = doubledNumbers } } 让存储= DataStore() store.numbers = [1,2,3,4,5] store.doubleNumbers()// [2,4,6,8,10] 下面是另一个示例。 有两个温度类别,每个温度类别都具有一个华氏度属性,该温度类别代表华氏温度。 每个类中还声明了一个将华氏温度转换为摄氏温度的函数。 温度A类{ var°F:Double = 60 func convertToCelsius()-> Double { 让度C =(self.F-32)*(5/9) 返回度 } } class TemperatureB […]
亲爱的泰勒·斯威夫特, 您的名字是软件开发社区中最受欢迎的歌手歌曲作者的名字之一。 只看这本教科书(即使它已经过时了!)… 您是否曾经考虑过学习编码? 好吧,我只想说您有很多软件开发人员! 只需检查这些项目。 看看你让我做什么代码 凯瑟琳·霍奇(Kathryn Hodge) 项目:她试用了腕带,并向观众展示了她的声誉巡回演出的视频。 萨拉·罗宾逊(Sara Robinson) 项目:使用TensorFlow对象检测API,ML引擎和(当然)Swift的Taylor Swift检测器! 在这里查看更多。 艾琳蹦床 项目:使用Python分析Taylor Swift的歌词。 在这里找到更多。 迅捷的语言 另外,如果您是开发人员,则可能了解Swift编程语言。 它与泰勒·斯威夫特(Taylor Swift)没有关系(尽管也许有一天会如此!),但我发现这些回应很有趣。 泰勒(Taylor)—您显然受到计算机科学界的喜爱。 如果这些事情听起来很酷,那就在音乐会开始的那几天,在休斯敦参加世界上最大的科技会议(格蕾丝·霍珀会议* GHC!)吧! 今年GHC 18售罄,有18,000名服务员❤ 让我们向您介绍这个迷人的编程世界。 火花会飞! 如果您已经创建了与Taylor Swift和/或声望巡回赛相关的内容,并希望将其包含在这篇文章中,请给我发电子邮件blondiebytes@gmail.com。 一些使您入门的想法: 使用命令行在Python中进行Taylor Taylor测验 带有蛇的增强现实应用程序! 看您让我做什么,增强现实僵尸口罩视频 让游戏开始。