Tag: swift

在iOS 10.3中对App Store评分和评论进行简单更新

iOS 10.3已于今天发布。 它引入了SKStoreReviewController,它带来了新的App Store评分和对应用程序用户的评论方式。 在此之前,开发人员使用自己的或第三方组件将用户带到App Store。 我们将通过一个简单的示例介绍这种新方法。 首先,我们需要最新的Xcode 8.3并启动一个新的Single View Application。 然后在ViewController.swift中,导入StoreKit并在ViewDidLoad中添加一行作为以下代码片段。 import StoreKit … override func viewDidLoad() { super.viewDidLoad() SKStoreReviewController.requestReview() } 构建并运行 评分 有关更多详细信息,请转到参考页面进行请求审查。 我们开发人员的另一个优势是 当iOS 10.3交付给客户时,您将能够以所有客户都可以查看的方式在App Store上回应客户评论。 John Gruber的这篇文章解释了有关新的App Store评论的一些详细信息。 谢谢你的时间。 请单击❤按钮以使更多的人看到此文章。

iOS中的复数形式

我在多语言应用程序中总是遇到复数形式的问题。 用英语来说问题不是那么大,可能是因为只有两种形式。 我是波兰人,我们的语言稍微复杂一点。 这是带有指导原则的多种语言的列表,我将向您展示如何轻松地在Swift中使用它。 首先,我们必须为“复数化器”创建协议。 没有这个,我们将无法轻松地更改语言。

Swift中的Leetcode解决方案和思想—问题554

矩阵和哈希表 难度:中等 录取率:46.5% 你面前有一堵砖墙。 墙是矩形的,有几排砖头。 砖块的高度相同,但宽度不同。 您想要从顶部 到底部绘制一条垂直线,并穿过最少的砖块。 砖墙由行列表表示。 每行是一个整数列表,从左到右代表该行中每个砖的宽度。 如果您的线穿过砖的边缘,则该砖不视为交叉。 您需要找出如何绘制线以穿过最小的砖并返回交叉的砖的数量。 您不能仅沿着墙的两个垂直边缘之一绘制一条线,在这种情况下,该线显然不会穿过任何砖块。 这个问题是相当困难的。 我们需要知道的前两件事是墙的宽度和高度 。 从宽度和高度,我们可以首先创建一个像这样的矩阵: 每个“ 0”表示那里的空间被砖块阻塞。 我们希望矩阵变成这样: 其中1表示两个积木之间的交集(或未交叉)。 因此,我们要做的是在各列之间找到最大的加1。 完整的方法如下所示: 该解决方案的复杂度基本上是O(n²),但是我们首先创建一个矩阵,并且还有其他for循环,这使得运行时间超出了时间限制。 矩阵似乎不是一个好主意,所以让我们以哈希表的方式进行。 在第3行,我们首先创建一个字典,以注意每列未越过多少块砖, 然后我们遍历砖墙,我们知道当柱位于砖之间时,柱上不会有任何砖交叉。 循环时替换mostCrossed变量。 该解决方案的复杂度也是O(n²),但是借助哈希表,显然更快。

图论同步

当然,戏剧总是在终点线。 显然,建立斜边涉及大量的数学和计算机科学技巧,但一个重要功能就是主要的// TODO ,这才是真正使游戏产生的功能,该功能可以检测玩家何时构造规则的多边形,以便我能够正确地保持得分,我保存到最后。 当然,本来不打算在发布前的最后几天将其压缩到应用程序中的,但是……好吧,这是怎么回事: 在被接受2018年AmazeFest和柏林游戏周之后,我决定以实现斜边为目标。 在这里和那里还有很多事情要做,但是我对游戏的状态感觉很好。 因此,我认为是时候清理(使用程序员的术语进行重构 )我的ShapeFinder算法,或者说是PolygonFinder算法。 我有一些工作可以检测绘制的多边形,但是,正如我去年夏天在访问慕尼黑时编写了大多数数学实用程序类,并且毫无疑问地回顾了在Englischer Gartens漫长的炎热天气之后,接着是几个巴伐利亚大小的Hofbräus,我认为我可能应该在柏林游戏节周之前及时发布一次代码。 我的临时技术是在线阵列中向后循环,并检查最后几行的长度和角度是否匹配。 很简单,对吧? 所有多边形具有匹配的边并共享相同的角度。 但是这种方法仅允许玩家通过依次绘制线条来对多边形进行评分。 这不是一个很好的算法,但它是一个占位符,并且在代码中非常孤立,所以我一直在取消其他功能,希望一旦我花了很多时间,就不会花太多时间再次刺中它。 但是现在,随着最后期限的临近,我卷起袖子并开始编码。 因此,我需要解决的问题是最佳地找到遍历我所有绘制的点和线并发现其中所有可能的形状或多边形的最佳方法。 输入图论。 当我快速阅读Minko Gechev最近在JS网络世界中的出色表现时,很明显,我扩展了标题为“ 数学背景”的部分,即图论基础。 哦,对,我记得不久前在Mathigon上看到过,等等,我不是有图论书的pdf版本吗? 我的直觉告诉我我正在做某事。 因此,我开始尽可能多地阅读有关图论的文章,​​突然间,我感到好像走进了衣柜,走进了纳尼亚。 图论中有很多很棒的东西。 欧拉的公式,不,不是那个,不是,不是,也不是那个,哦,是的,那个关于图形中的面孔的那个。 所有这些酷桥梁问题; 网络和搜索算法以及计算机科学的众多应用…但是,等等,让我们不要分心,我们在这里做几何。 那么图论如何解决我的几何问题? 好吧,还记得点和线那些纯真的几何定义吗(请参阅上一篇文章)? 事实证明,它们在图论地下世界中具有秘密的别名。 它们被称为“顶点”和“边缘”,它们共同构成了Graph帮。 而且,随着时间的流逝,每当有人创建一些很酷的几何设计时,他们也在构造一个可以应用图论规则的图。 好吧,总而言之,我花了很多个晚上试图推出自己的准深度-第一本特利-奥特曼-迪克斯特拉的递归-噩梦-多边形搜索算法,希望最终能获得更多的霍夫布鲁斯原来,我一直都坐在解决方案上。 GameplayKit的寻路工具为我们节省了很多时间,这就是为什么此游戏是为iOS制作的。 请参阅下面的文章。 用Swift编写Dijkstra算法的正确方法 剧透警报:您根本不写! medium.com 最后,我可以用由GameplayKit背后的一些了不起的工程师设计的一些漂亮的数学代替我丑陋的,不易受Hofbräu影响的解决方案(“ 如果不是漂亮,那就不是数学 ”,这也适用于编程)。 有时编写自己的解决方案很令人满意,但有时使用别人制造的锤子砸烂那些讨厌的指甲也很令人满意。 而且,一如既往,我在此过程中学到了很多东西。 这是我偶然发现的众多资源中的一些,这确实让我对数学这个令人惊讶的超酷分支感到兴奋。 图论的温和介绍 如果没有需要解决的问题,那么世界上的许多事情将永远不会存在。 medium.com 揭开深度优先搜索的神秘面纱 一旦您对不同的数据结构有了足够的了解,您就开始对自己进行思考:对,那么……是什么…… 开发到 并使用Bently-Ottmann线相交算法检查Swift算法俱乐部和多边形检测。

在终端中运行和编译Swift代码

有时在终端中运行快速代码更为方便。 特别是当我实现数据结构或测试任何算法时,我喜欢在文本编辑器中编写代码并在终端中运行。 让我们看看如何在macOS终端中做到这一点: 迅捷–version 它在我的终端中显示以下输出 测试快速 打印(“ Hello World”) 在终端中运行 快速测试 输出 你好,世界 如果要一起编译2个或更多swift文件,则必须有一个名为main.swift的文件,它是顶级可执行文件。 它类似于C或C ++或Java中的主要功能。 文件1:a.swift func helloWorld(){ 打印(“ Hello World”) } file2:main.swift func hello(){ 你好,世界() } 你好() 编译和创建可执行程序: swiftc a.swift main.swift -o编 它将编译链接在一起的a.swift和main.swift文件,并创建一个名为prog的可执行文件。 要在终端中运行可执行程序: ./编 输出 你好,世界 资料来源:thinkdiff.net

统一日志记录和活动跟踪

去年,苹果对所有更新平台(iOS 10,watchOS 3,tvOS 10,macOS 10.12)的日志记录系统进行了重大更改:现在,将旧的ASL和Syslog API重定向到了新的统一日志记录,从而大大改善了活动跟踪。 这是一个关于我如何采用它们来调试用Swift3编写的极其异步的watchOS3 / iOS10应用程序的故事。 为什么要进行统一日志记录? 认识Fox:具有watchOS3扩展功能的iOS10应用。 Fox正在通过Apple Watch的加速度计跟踪用户的运动活动,将原始数据传输到手机,然后传输到服务器以进行进一步的大数据分析。 棘手的事情是:用户参加医学研究并且他的生活非常艰苦,因此Fox不应在白天打扰他,它应该在后台运行并以静默方式收集数据。 至于watchOS3,watchapps主要被视为前台应用程序,后台执行仅用于更新UI。 对于Dock中的应用程序,每小时可以获得一次后台执行时间;对于在当前表盘上拥有活动Complication的应用程序,则可以获得每小时两次的后台执行时间。 在每个后台任务中,Fox应该从运动传感器请求加速度计数据(这是异步完成的),将其写入文件,放置到传输队列中,等到将其传输到iPhone并获得传输成功无误的响应。 另外,我们希望通过在N个并发操作中运行此请求数据文件传输响应来提高性能。 我们希望日志能够调试整个事情。 像大多数iOS项目一样,第一动力是使用像Crashlytics或Cocoalumberjack这样的流行的第三方框架。 令人失望的是:Crashlytics仍然缺乏watchOS支持,并且想像一下我在Cocoalumberjack的普通文本日志中看到的一团糟,当时四个线程和许多回调开始同时将消息推送到文件末尾。 另一个问题是观察者效应 :通过Cocoalumberjack编写的每条消息都占用了CPU时间,更改了整个算法的时间,并且在后台任务期间处理的数据量更少。 watchOS3具有斯巴达式的限制:如果您的上一个后台任务花费的时间太长或占用了过多的CPU,则OS不会为您提供后台执行时间。 这种伐木造成的危害大于利润。 因此,我需要快速的日志记录系统,适合异步代码,并具有不受欢迎的Apple平台支持。 我已经决定从根本上尝试原生的统一日志记录和活动跟踪。 记录中 功能,如WWDC会话721中所述: 分类和过滤 :每条消息都有子系统,类别,四个级别之一(默认,信息,调试,故障,错误),已启用标志和目标(磁盘或内存)。 隐私 :通过用字替换动态字符串,集合和数组,防止将个人身份信息意外泄漏到存储的日志中。 可以在每个参数的基础上覆盖此行为。 可用性 :日志记录系统为您收集呼叫者信息,内置类型说明符可简化消息准备。 性能 :观察者影响最小。 数据存储在/ var / db / diagnostics /中的二进制.tracev3文件中,并以.logarchive文件传输(两种文件格式都可以使用macOS Sierra中更新的Console.app打开)。 整个系统的日志被写入一个位置。 尽管在WWDC会话幻灯片中描述了许多C函数,但在Swift中的用法却非常简单:一个os_log函数以静态字符串 (在编译时称为)接受消息,并带有占位符作为参数,参数本身, OSLog(如果要使用非参数) -default子系统和类别,以及用于日志级别的枚举 。 仅消息字符串是必需的: func os_log(_消息:StaticString, […]

使用UIPanGestureRecognizer删除UICollectionView Swift 3中的单元格

我想分享一个快速的小项目,该项目使用UIPanGestureRecognizer删除UICollectionView中的单元格。 以下是其外观示例: 假定您具有如何创建UICollectionView和自定义CollectionViewCell的基本知识。 项目文件可以位于这里: GitHub – almusto / PanToDelete 通过在GitHub上创建一个帐户为PanToDelete开发做出贡献。 github.com 当涉及到UI时,该项目非常简单。 我所做的就是创建一个UICollectionViewController,并将其嵌入到导航控制器中的自定义单元格。 设置CollectionView: 让我们快速浏览一下UICollectionView的基本设置 因为我们使用的是UICollectionViewController,所以我们不需要设置委托,因为Xcode会为我们这样做。 但是,我们确实设置了UICollectionViewDelegateFlowLayout以允许我们调整在viewDidLoad()之后的第一个函数中执行的单元格框架。 接下来的三个函数是标准的collectionView函数,我们在其中设置节数,将numberOfItemsInSection设置为grocerList.count,然后创建单元格本身。 您可能想知道功能允许我删除单元格的位置在哪里……不要担心,我稍后再讲。 设置自定义单元: 这是我们大多数代码将要使用的地方。 让我们先来看一下变量和初始化程序。 我在这里创建了一些变量。 cellLabel将存储我们的杂货项目,两个deleteButton标签将根据我们平移的方式添加到左侧或右侧的内容视图下方。 当然还有我们的平移手势识别器。 我们还向类添加了UIGestureRecognizerDelegate协议。 稍后我将解释原因。 接下来,我们有两个init方法,其中调用了我创建的自定义函数comonInit()。 对于所需的init,我仍然有些朦胧,但是据我所知,当我们创建自己的自定义类init时,我们需要使用它。 此必需的init允许我们通过NSCoder“取消存档”数据。 似乎这里发生了很多事情,但这确实很简单。 而不是在情节提要中创建这些对象,而是手动进行,因此我们必须初始化每个对象并将其添加到视图中。 让我们一次浏览一个项目。 首先,我将contentView的背景色设置为灰色,将self.background颜色设置为红色。 每个单元格都有一个contentView,它显示我们想要的单元格中的对象或颜色。 当我设置self.background颜色时,实际上是在contentView下设置颜色。 完成此操作后,我将初始化cellLabel并将其添加到contentView中。 我也将translatesAutoresizingMaskIntoConstraints设置为false,这使我可以手动设置该标签的约束。 如果我不这样做,则自动布局会尝试为我创建约束。 同样,我初始化deleteLables并将它们插入到contentView的下面。 因为我希望这些标签可以用平底锅拍摄,所以我不在这里设置边框。 相反,我在平底锅发生时设置了帧。 最后,我使用一个名为onPan的动作来初始化平移手势。 与创建UIButton时非常相似。 我还将委托设为self..self作为CustomCell类。 现在,我们的视图已初始化,让我们开始平移手势: 制作手势: 首先让我们看一下我们的onPan函数。 您会注意到我们的if语句涵盖了手势的某些不同状态。 如果状态为“开始”,则不执行任何操作;如果状态为“已更改”,则调用setNeedsLayout()。 该方法说“在下一个运行循环上调用layoutSubViews()。”当某人按下我们的单元格时,状态变为开始,然后当他们向左或向右移动该单元格时,状态变为更改并调用layoutSubViews()。 现在在layoutSubViews()中,我们通过调用translation(in:View)来检查状态是否已更改,以及状态是否改变,以获取平移的当前点,该平移返回“标识坐标系统中视图新位置的点”。然后,我们根据该点设置contentView和deleteLabels的框架。 现在回到我们的onPan函数,我们有一条else语句,它检查平移手势速度以查看其是否大于每秒500点。 在检查速度之前,您会注意到腹肌。 这是绝对值,我们这样做的原因是因为用户可以向左或向右平移,因此该值可能为负。 […]

使用ARKit在增强现实中显示视频

首先,我要做的是浏览Pinterest来检索此特定打印件。 接下来,我裁剪了将要检测并覆盖实际视频的图像。 最后,我们将在检测到的图像上播放视频。 现在您已经创建了一个项目,让我们在资产文件夹Assets.xcassets创建一个新的AR资源组。 添加裁剪后的图像(我的图像被命名为black )并为其设置尺寸。 尺寸是我们实际的 在我们打印的照片上裁剪图像尺寸。 根据我的测量,我打印的照片约为14x15cm。 键入宽度0.14米后,Xcode会自动生成高度。 接下来,拖放将用于播放检测到的图像的视频文件。 确保在添加视频时,将其添加到我们的项目目标中。 添加代码 删除ViewController.swift所有代码,并将其替换为上面的代码。 我们在这里所做的是设置AR配置以跟踪图像并设置应用程序应跟踪的图像 。 接下来,我们将使用一种委托方法将视频添加到检测到的图像上。 当要向场景中添加节点时,委托方法会通知我们。 该节点将为空,因此我们可以自定义。 但是在我们输入新代码之前,这将是逻辑流程: 首先检测我们的应用何时在锚中添加了新节点 检查我们的锚点是否匹配ARImageAnchor ,如果匹配,则表示检测到我们的图像 创建一个包含我们的视频文件的视频节点,并将其添加到视频场景中。 调整所有必要的位置 创建一个与检测到的图像具有相同方向和大小的新平面 将我们的视频节点添加到飞机上 创建一个包含该平面的新节点 将此新节点添加为子节点 这就是我们最终的结果。 让我们运行该应用程序并查看结果! 真好! 我们的AR应用程序正在按预期运行! 但是,有一个小问题。 原始的《 Daily Prophet新闻具有循环效果,因此让我们将视频循环显示在图像上。 循环播放视频 编辑我们的代码如上。 我们已更改的是: 我们使用AVPlayer播放项目 使用AVPlayer初始化我们的video node 添加观察者,以便当播放器完成其当前项目时,重置视频并再次播放 继续运行该应用程序! 最终输出应该与我们要实现的输出非常相似!

通过Swift Package Manager生成Xcode项目

作为我使用Swift的旅程的一部分,我正在观看WWDC 2016的这段视频—“ 使用Swift开源进入服务器端 ”,并且可能是我的同事Pat提到的视频的31:36,“我经历了并创建了一个Xcode项目”。 Xcode项目的创建是为了调试Bluepic的Bluepic-Server文件夹下的服务器端代码,Bluepic是用于iOS的示例照片共享应用程序。 作为一名Swift新手,我想知道他是怎么做到的? 我开始探索各种选择,例如CMake,QT等,但没有得到我想要的东西。 注意:要快速创建,维护和监视BluePic示例,请参阅IBM Cloud Tools for Swift 在尝试Kitura( 用于 Linux(Ubuntu)上Swif t的Web框架和HTTP服务器 )时,我正在阅读Package Manager的文档,并遇到了此说明。 使用Swift快照,可以使用包管理器的支持来生成Xcode项目。 如果您的Mac上已经安装了Xcode 7.3.1或更高版本,请执行Swift快照安装步骤,最终结果应如下所示 在终端上,运行以下命令(如果尚未完成) 导出PATH = / Library / Developer / Toolchains / swift-latest.xctoolchain / usr / bin:“ $ {PATH}” 导航到终端上的BluePic-Server文件夹,然后运行以下命令以生成.XcodeProj, 迅捷包generate-xcodeproj 如果一切正常,您应该在文件夹中看到Bluepic-Server.xcodeproj文件 Vidyasagars-MacBook-Pro:Bluepic-Server VMac $ swift软件包generate-xcodeproj 克隆https://github.com/IBM-Swift/Kitura.git HEAD现在位于d643c31 IBM-Swift / Kitura#513 Changed BluePic链接 解决的版本:0.15.7 克隆https://github.com/IBM-Swift/Kitura-net.git HEAD现在位于6193ca8,通过执行更少,更长的字符转换操作来避免__CFGetConverter中的锁定瓶颈(#32) […]

在Swift 3中使用重定向进行Firebase身份验证– Daveyon Mayne –中

在Swift 3中使用重定向进行Firebase身份验证 我当时正在准备一个Stack Overflow,即SO,是有关身份验证的问题,用户登录时将重定向到哪里。从Ruby on Rails的背景出发,该逻辑被考虑使用Devise。 如果用户尝试通过Web链接转到其个人资料,则Devise会检查该用户是否已登录,如果没有登录,则需要进行身份验证,然后将用户重定向到其原始目的地。 我不知道如何使用Swift 3做到这一点。 与你们中许多人睡觉或执行正常的凌晨4点“活动”(微笑地咬嘴唇)不同,那是我学习iPhone旁项目的时间。 就在我打出“发表您的问题”之类的答案之前,解决方案就来了! 假设您已经在应用中配置了指向ViewController的3D touch。 对我来说,问题是,如果用户注销,并且他们3D触摸了应用程序图标上的链接,它将直接将他们带到ViewController。 我想要的是它需要身份验证,然后重定向到其目的地。 很简单的! 在AppDelegate文件的内部,您应该具有以下功能: 如果有更清洁的方法可以解决这个问题,我全神贯注。 和平!