Tag: Swift编程

如何在您的SWIFT项目中集成DROPBOX

SwiftyDropbox是一个Swift SDK,可将Dropbox轻松集成到您的项目中。 在您的项目中合并SwiftyDropbox的系统要求是: iOS 9.0以上 macOS 10.11以上 XCODE 8.0以上 在合并SDK之前,我们需要在Dropbox应用程序控制台中注册我们的应用程序,这将创建一个与我们进行的API调用相关联的应用程序记录。 使用可可豆 打开终端,通过键入cd ..进入根文件夹。 使用以下内容导航到项目目录,然后按Enter cd 然后使用pod init或open -a Xcode Podfile创建一个新的Podfile。 打开Pod文件后,添加Pod’SwiftyDropbox’。 您的Podfile应该看起来像这样: use_frameworks! 目标“ ” 吊舱“ SwiftyDropbox” 结束 SwiftyDropox与Swift 3兼容,但它也具有Swift 2.3兼容分支。 您可以使用以下方式访问它 use_frameworks! 目标“ ” pod’SwiftyDropbox’,:git =>’https://github.com/dropbox/SwiftyDropbox’,:branch =>’swift_2_3′ 结束 运行以下命令以逐个安装依赖关系 $ pod安装 $ pod更新 恭喜你! 您已成功将SwiftyDropbox SDK安装到项目中。 现在转到您的项目并打开.plist。 添加以下内容以处理Apple的新安全更改。 LSApplicationQueriesSchemes dbapi-8-emm dbapi-2 这样,Dropbox SDK可以检查设备上是否安装了正式的Dropbox应用程序(如果已安装),则可以使用该应用程序以编程方式获取OAuth 2.0访问令牌。 […]

MapKit JS入门

苹果在WWDC 2018上宣布了MapKit JS,使开发人员能够在浏览器中显示Apple地图。 这意味着您可以将与您在iOS设备上熟悉的丰富程度和交互性相提并论的浏览器。 在这篇文章中,我将解释如何开始使用MapKit JS以及如何在Web应用程序中显示Apple地图。 获取MapKit JS密钥 在开始实施应用程序之前,您需要请求并获取MapKit JS密钥。 这可以在Apple Developer Portal上完成。 单击“ 证书,标识符和配置文件 ”,然后选择地图ID,如以下屏幕截图所示: 使用右上角的添加按钮创建一个新的地图ID,如下所示: 创建地图ID后,下一步就是为该地图ID生成密钥。 如下面的屏幕截图所示,这是在键页面上完成的: 为您的地图ID创建一个密钥,然后下载密钥。 请勿松开钥匙,否则将无法找回钥匙。 再次不要松开钥匙。 注册MapKit JS密钥就差不多了。 在下一节中,我将介绍如何开始在网页上显示地图。 实施节点服务器 Apple提供了两种在网页上显示地图的方式。 我们将研究推荐的方法,该方法还包括在我们的服务器上生成令牌,该令牌随后由Apple进行验证。 如果您对自己生成令牌不感兴趣,那么可以使用这个令人惊叹的网站MapKit JS Helper,只要您输入所有必要的详细信息,它将为您生成令牌。 令牌由标头和有效负载结构组成,如下所示: 您还可以在此处阅读有关规格的更多信息。 如前所述,要使其正常工作,我们将需要实现和配置服务器。 我们的第一个任务是创建一个端点,该端点将向我们返回所需的令牌。 下面的代码在“ / services / jwt ”处创建一个端点,该端点负责创建令牌。 确保从Apple Developer网站下载的私钥是节点项目的一部分。 我们将需要该密钥来对令牌进行签名,如下面的实现所示。 为了对令牌进行签名,我们使用了NPM包“ jsonwebtoken”。 令牌签名后,我们将其作为JSON响应的一部分返回。 甜! 下一步是使用令牌来验证我们对MapKit JS的请求。 显示地图 Apple提供了一些示例,可用于显示和自定义地图的外观。 我们将显示地图,并在地图上添加注释以指向特定的兴趣点。 这是完整的HTML和JavaScript代码。 下载代码 […]

在Swift中实现编程语言—第4部分:解析器

这是“用Swift编写编程语言”教程系列的第四部分。请务必查看 第3部分 。 语言解析被广泛认为是只有经验丰富的程序员才能做的事情。 这是几乎在任何领域都常见的误解。 当然,作为Swift等广泛使用的语言的核心贡献者,意味着您必须在该主题上拥有丰富的经验。 但这适用于每种类型的编程,并且不应使我们害怕创建自己的解析器。 什么是解析器? 解析器的主要目标是将Lexer生成的令牌列表转换成我们语言语法的数据结构,通常,这种“数据结构”是类似树的结构,例如“抽象语法树”。 像计算机科学中的所有内容一样,最好使用Wikipedia(:)来定义这种树。 抽象语法树是用编程语言编写的源代码抽象句法结构的树表示。 哇,这是很多定义不正确的概念。 让我们分解一下: 摘要—事实证明,我们并不关心解析器收到的所有令牌。 考虑表达式2 * (2 + 3) ,这里的树实际上不需要关于左括号和右括号的信息。 只是在其中表达的优先级。 括号已被抽象出来。 语法结构—用Swift的术语来说,这通常意味着任何表示struct , enum或class struct ,它们表示源代码如何以我们的语言语法形成。 自顶向下解析 实现解析器的方法有很多,但是我们今天要看的是自上而下的解析。 在自上而下的解析中,在继续进行更详细的部分之前,将生成语法语法树的最高级别的结构。 通常认为它比同等技术(自下而上)要慢一些,但更容易掌握,因此非常适合本教程。 递归体面解析 自上而下解析的一种非常流行的方法称为递归体面解析。 这种流行并不是巧合,因为它们最容易实现。 正如您可能假设的那样,这种简单性需要付出一定的代价,而您将是对的,因为它们也是性能最低的。 但是我们还是会选择递归体面的方法,以使本教程尽可能简单。 实作 对于我们的解析器,让我们从简单的类定义开始: 类解析器{ 让令牌:[令牌] var index = 0 init(令牌:[令牌]){ self.tokens =代币 } } 在全面实施之前,有必要回顾一下我们的语法: E⇒ | | () 运算符⇒ […]

快速错误处理

根据Apple的说法:错误处理是响应程序错误状态并从错误状态中恢复的过程。 Swift为运行时引发,捕获,传播和操作可恢复错误提供了一流的支持。 我们使用枚举对错误进行建模。 enum需要符合Error协议,这使我们能够将值与每种case相关联,并用于错误处理。 例如,这是我们如何表示失败电话的错误情况: 列举CallError:错误{ 案例号 外壳没有足够的电池电量 } 通过在函数末尾添加throws ,我们可以指定函数可以引发错误。 一旦函数抛出错误,我们就可以catch该错误并使用do-try块进行处理。 根据Apple的说法:要表明函数,方法或初始化程序可能引发错误,请在函数的参数后面的声明中编写throws关键字。 标有throws的函数称为throwing函数 。 如果函数指定了返回类型,则在返回箭头( -> )之前编写throws关键字。 因此,根据该定义以及上面创建的错误,我们创建一个函数来throws func doACall()引发{ 如果lostInTheWoods { 抛出CallError.noSignal }否则,如果batteryNeedsMoreJuice { 抛出CallError.noEnoughBatteryPower } 打印(“所有称职的妈妈”) } 如果在执行调用时我们发现lostInTheWoods或batteryNeedsMoreJuice为true ,则此函数将throw错误。 这基于CallError枚举。 为了捕获和处理CallError.noSignal或CallError.noEnoughBatteryPower我们需要在do-catch块中try 。 做{ 尝试doACall() }捕获CallError.noSignal { 打印(“爬山”) }捕获CallError.noEnoughBatteryPower { 打印(“插入手机”) } 考虑到如果没有错误, catch块将被忽略,您可以通过catch块识别函数抛出的错误。 您可以在此处查看游乐场代码。 资料来源: 错误处理 错误处理简介 我希望您喜欢这篇文章,并且总体上觉得它很有用。 并且不要犹豫,留下反馈或任何问题。 谢谢!

Swift 4.1发布过程

这篇文章描述了Swift 4.1的目标,发布过程和预计时间表。 Swift 4.1是对Swift 4.0的源兼容更新。 它将包含对核心语言的一些附加增强功能,以及对Swift软件包管理器,Linux上的Swift的改进,以及对编译器和标准库的总体质量的改进。 Swift 4.1与4.0 不二进制兼容。 它包含各种幕后更改,这是在Swift 5中稳定Swift ABI的工作的一部分。 Swift 4.1计划于2018年上半年发布。 源兼容性 使用Swift 4.0编译器构建的绝大多数源(包括使用Swift 3兼容模式的源)都应使用Swift 4.1编译器进行编译。 在某些特殊情况下,这不能绝对保证。 这包括通过使用长期期待的泛型功能解决了使用泛型的问题,从而解决了编译器中的错误行为或极端情况。 但是,人们的期望是,大多数项目将在没有源代码更改的情况下继续构建。 -swift.org

蒸气3系列III-测试

在上一篇文章中,我们实现了两种验证用户身份的方法:HTTP基本身份验证和承载令牌授权。 因此,我们的应用程序仅接受来自经过身份验证的用户的请求。 但是,即使我们的应用程序很简单,我们也应该为端点编写一些单元测试。 测试是软件开发的重要组成部分,编写单元测试使我们能够快速开发和发展应用程序。 为了快速开发新功能,我们希望确保现有功能不会中断,并且拥有完善的测试套件可让我们验证更改代码库时一切仍然正常。 在本文中,我将演示如何为CRUD端点编写单元测试,以及如何在具有Docker的Linux机器上运行测试。 请注意,本文将基于先前的实现。 在Swift中编写应用程序的好处之一是,我们能够使用可爱的Xcode运行测试。 但是,为了使用Xcode运行测试,我们必须事先生成测试目标。 请打开Package.swift并将以下行替换为.target(name: “Run”, dependencies: [“App”]) 。 让我们开始编写Application的辅助方法。 请打开Application+Testable.swift并添加以下代码。 现在,我们可以运行测试用例了,它应该通过了! 然后,我们可以为用于检索User模型的端点编写测试用例。 在UserTests.swift内部,将以下函数追加到testUserCanBeSaved函数下方。 这是整个项目。 让我们回顾一下这个测试过程。 首先,我们生成新的测试目标和相应的文件。 此外,我们编写了Application和User模型的辅助方法,以使我们的测试用例简明易懂。 其次,我们使用辅助方法编写每个端点的测试用例,并使用Xcode运行测试。 最后,我们使用Docker在Linux环境上运行测试用例。 测试是软件开发的重要组成部分,并且编写单元测试并使其尽可能自动化是有益的。

如何使用MSL(金属着色语言)向UIImage添加效果。

如果要创建可以更快,更简洁地处理的图像效果,则使用着色器语言是更好的方法之一。 例如,此封面图像由GPU用几行着色器代码处理。 而且我已经使用着色器发布了2个应用程序(FastFilm / PXSL)。 我将向您展示如何用MSL编写。 Xcode 10.0(Swift 4.2) iOS 12.0 Metal&MetalKit在iOS 9和更高版本上可用。 但是,它们不适用于iPhone 5和5C。 ImageProcessor.Shared.Setup() let outImage = ImageProcessor.Shared.Run(inImage) 感谢您的阅读。 请尝试重写着色器程序。 下次,我将撰写有关如何使用MSL创建电影风格效果的文章。 顺便说一句,这是我的第一篇文章! 所以..最后, “ Hello Medium” 。

Swift和Firestore:查询具有今天日期的字段

我天真地尝试执行以下操作。 让ref = Firestore.firestore()。collection(“ posts”) 让今天= Date() 让queryRef = ref.whereField(“ created”,isEqualTo:今天) 不幸的是,它没有返回任何结果,我想它正在为我们的日期字段寻找完全匹配的结果。 注意:希望实际上是这样。我并没有过多地关注它是否应该返回非空结果。 😅 经过几次Google搜索,我想到了这个: 让日历= Calendar.current 让组件= calendar.dateComponents([。year,.month,.day],来自:Date()) 让开始= calendar.date(来自:组件)! let end = calendar.date(byAdding:.day,value:1,to:start)!let queryRef = ref .whereField(“ created”,isGreaterThan:start) .whereField(“ created”,isLessThan:end) 现在,我得到了预期的结果。 ☺️ 我们可以快速将其重构为CollectionReference上的方法…… 然后在呼叫站点: 让queryRef = queryRef.whereField(“ created”,isDateInToday:date)

在MacOS和Linux上使用ImageMagick,Vapor 3和Swift对照片加水印

回顾过去(您还记得Web 2.0吗?😉),我过去经常围绕照片进行编程。 在格式之间调整大小,缩放,旋转和转换。 最近,我不得不创建一个Web服务,该服务使用Vapor生成带水印的图像。 事实证明,还没有太多用于图像处理的库,因此这个简单的任务成为研究中一个有趣的问题。 有两个主要的图像处理库:GD和ImageMagick。 ImageMagick有点像高级库,所以我决定首先使用它。 ImageMagick有一个有趣的Swift包装器,称为MagickWand。 不幸的是,它根本不支持文本操作,因此我不得不更深入地研究。 我找不到任何有用的东西,所以我想:“为什么不在Swift中只使用一些ImageMagick C函数呢?”事实证明,这很容易做到! 安装ImageMagick 在ImageMagick网站的开发部分中,您可以找到MagickWand和MagickCore的文档。 这些是用C编写的用于与ImageMagick处理库进行交互的接口。 将其包装到Swift包中非常容易,但是首先让我们安装ImageMagick。 让我们从macOS开始。 您可以自己编译ImageMagick,但对于macOS,仅使用Homebrew会更容易。 ➜brew安装imagemagick @ 6 如果未指定@6 ,则默认情况下将安装最新版本。 我在Linux上的版本7遇到问题,因此我决定将macOS和Linux都使用旧版本。 安装后,您会注意到自制软件未创建符号链接(有关以下信息:仅桶依赖项)。 为了获得有关ImageMagick所需的信息,此部分很重要: 为了使pkg-config查找[受电子邮件保护],您可能需要设置: 导出PKG_CONFIG_PATH =“ / usr / local / opt / imagemagick @ 6 / lib / pkgconfig” 您可以只在终端中在每个pkg-config命令之前添加PKG_CONFIG_PATH ,但是如果使用zsh只需运行,则永久添加它更容易: ➜echo’export PKG_CONFIG_PATH =“ / usr / local / opt / imagemagick […]

串行异步操作队列

什么是OperationQueue 从Apple文档 操作队列 根据它们的优先级和准备情况 执行其排队的 Operation 对象。 在将操作添加到操作队列之后,该操作将保留在其队列中,直到它报告完成任务为止。 添加操作后,您无法直接从队列中删除该操作。 OperationQueue具有一个名为maxConcurrentOperationCount的属性,您可以将其设置为1,以使串行 OperationQueue在操作为同步操作时可以完美地工作。 问题 当我想要将其发送到蓝牙时,检测到传感器框架之间存在干扰。 发生了什么事!🤔我们使用很多“ @synthesize”关键字来确保线程安全并防止传感器线程之间的任何干扰。 然后我寻找最佳解决方案,最后我找到了maxConcurrentOperationCount I 那就是我需要的,它将解决我的问题 我开始重构1Sheeld的代码以使用maxConcurrentOperationCount. 不幸的是,干扰仍然发生。 我相信在文档中只能同时执行一个操作,但这并不是为什么。 如果操作同步,则 maxConcurrentOperationCount 可以完美地工作,但是如果该操作是异步的(例如调用API请求或使用蓝牙发送数据),则该操作将无用。 那简单的代码显示了问题 创建操作