Tag: 迅捷4

类型安全的用户默认值

以前,我们只是通过使用字符串键将数据存储在UserDefaults中。 每当我们需要照顾数据类型时 。 setBool(_:forKey:_)和co是解决方案。 可是等等?! 如果您需要获取给定密钥的值怎么办? 您需要遍历代码库并检查在那里存储了什么类型:它是Int吗? 或数组。 这是浪费时间,甚至如此危险:您可以在此处存储Bool,其他人可以存储任何其他类型。 但是您可以确定这是一个布尔型,并且解开nil可选项可能会导致崩溃。 我为什么过去说话? 因为自Swift 3推出以来,一个不错的解决方案就可以实现。 setValue(_:for key:_)方法现在接受Any值,不再接受AnyObject :这使事情变得更加容易。 让我们看看如何: 使用泛型,我们可以定义一个简单的DefaultKey结构,该结构包含要存储的类型和键名信息。 这样,您可以轻松地在常量文件中定义DefaultKey集 完成此操作后,您可以轻松地为UserDefaults构建通用扩展,如下所示 这个小界面可让您获取或设置存储的值,而无需关心值的类型 如果您尝试为LaunchesKey存储字符串会怎样? 实际上,此界面会自动提醒您应为定义的键存储什么类型。 检查我的Github存储库上的完整代码:https://github.com/dalu93/Defaults 更新:使用Swift 4现在可以实现通用下标。 有关更多信息,请查看GitHub上的develop分支。

在Swift中创建自定义macOS共享服务

在最新版本的macOS中,共享按钮已成为常见的OS功能。 从Finder到Safari的所有内容都具有这些按钮,它们使用相同的标准化,可自定义和可扩展的体验。 我们可以使用NSSharingServicePicker在我们自己的应用程序中轻松使用它们,甚至可以添加自定义服务! 它们的功能类似于使用UIActivityViewController的iOS共享表。 我将演示如何自己使用NSSharingServicePicker ,以及如何使用NSSharingService和相应的委托添加自定义共享操作。 示例应用程序( 末尾提供了完整的示例代码 )将一个简单的“复制文本”添加到剪贴板选项到我们的共享菜单。 连接一个NSSharingServicePicker Apple仅需几行代码,即可轻松使用它: 采用NSSharingServicePickerDelegate 我们遵循NSSharingServicePickerDelegate并实现了sharingServicePicker ,然后创建了自己的定制服务。 首先,我将共享整个代码,然后将其分解为多个部分。 小调整 在大多数情况下,就是这样。 还有一些其他小事情要注意: 如果使用按钮操作触发NSSharingServicePicker ,则可能会收到有关可通过在按钮.sendAction(on: .leftMouseDown)设置.sendAction(on: .leftMouseDown)来修复的操作的错误。 NSSharingService要求您提供共享服务的映像,我建议为此使用xcode资产文件夹 示例项目源代码 如果您想使用此代码查看简单的示例应用程序,可以在此处找到 这篇文章的启示 我目前正在为我的高级项目构建一个菜单栏macOS应用程序,它使您可以立即将文本或代码共享到gist.github.com。 整个代码在我的GitHub上都是开源的,可以在这里找到。 当希望将简单的剪贴板复制功能添加到共享表时,我找不到有关该主题的任何stackoverflow问题或中级文章,因此我决定写我的第一篇文章! 谢谢阅读!

开发自定义Pod并将其发布到Cocoapods库

本文将引导您完成创建自定义pod的过程,该pod将扩展方法添加到UIImage视图并将其发布到Cocoapods库。 让我们从创建一个简单的GitHub存储库和一个本地pod库项目开始,然后继续填写pod规范和实际代码。 在继续前进之前,您应该了解什么 CocoaPods基础 Github基础 熟悉Xcode 9 适应Swift-4 让我们开始吧 我希望所有人都将CocoaPods用作iOS项目的依赖项管理器,但是如果您没有设置所有内容,请按照以下步骤操作。 继续并启动终端应用程序,并输入cd并按Enter键,以确保您位于路径目录中 通过运行gem install安装CocoaPods。 安装完成后,请检查Pod版本 须藤宝石安装cocoapods sudo pod –version 现在,我们已经在机器上安装了Cocoapods,让我们转到GitHub并创建我们的Pod回购。 如果您尚未设置帐户,请填写注册信息并执行快速注册过程。 现在,如果您已经拥有Github帐户,请继续登录。 现在,我们选择右上角的加号图标,然后单击新的存储库。 您计划发布的所有cocoapod必须具有唯一的名称。 我将我的存储库命名为SKImageExtension,然后点击创建存储库并完成此操作。 我们需要在桌面上创建实际的Pod库项目,这对我们来说是幸运的,CocoaPods具有实用程序命令来帮助我们生成完整的模板。 让我们再次打开终端,我希望将项目保存在桌面上,因此我将目录更改为桌面。 现在,让我们运行create命令: pod lib创建SKImageExtension pod lib create将通过项目文件夹的名称生成项目。 现在,这应该与GitHub存储库匹配,因此在我的情况下,它将为SKImageExtension 现在,这将开始提示我们需要填写以下详细信息平台,开发语言,示例应用程序,测试框架,基于视图的测试选择以下所示的选项 当create命令完成安装后,您将看到我们的pod已安装完毕。 我们还将看到Xcode自动打开。 工作区项目文件。 现在,由于我们正在使用Xcode 9,因此我们将立即收到项目设置警告 。 因此,继续并在导航器中单击它,然后转到“ 更新为推荐的设置” 。 在这里,我将所有内容保留为默认值,然后单击Perform Changes 。 现在,我们在这里要做的最后一件事是将新的pod库推送到我们之前创建的GitHub存储库中。 为此,GitHub在回购页面上给了我们一些简单的说明 因此,让我们回到终端并通过Command + K再次清除日志,我们需要导航到pods库的根文件夹。 ->桌面:cd SKImageExtension -> SKImageExtension:git初始化 […]

核心图片样本

要了解Core Image,您需要按顺序阅读以下文章。 每篇文章都附带一个样本。 评论中解释了一些复杂的地方。 如果您无法下载完整的源代码项目,请在此处下载。 好的,我们走吧 核心映像概述 使用内置或自定义过滤器来处理静止图像和视频图像。 查看更多 使用内置滤镜处理图像 对图像应用棕褐色调,高光增强和缩放等效果。 查看更多 侦探 图像处理器,用于识别静止图像或视频中的显着特征(例如人脸和条形码)。 查看更多 CIDetectorTypeQRCode 一种检测器,它在静止图像或视频中搜索快速响应代码(一种2D条形码),并返回提供有关检测到的条形码信息的CIQRCodeFeature对象。 您可以在此处下载完整的源代码项目。

iOS 2018系列:破解iOS采访或成为iOS专家(8)

快速的泛型和LRU缓存 我们将通过此博客学习Swift和LRU算法中的泛型。 当您的面试官要求您在纸上编写通用LRU缓存的代码时,对于iOS开发人员来说,这是第3轮或第4轮的热门问题,根据面试官的知识,实现语言可能会有所不同……哈哈哈! 希望你有一个好的面试官🙂 通用 代码使您可以编写灵活,可重用的函数和类型,这些函数和类型可根据您定义的要求与任何类型一起使用。 泛型函数 func swapTwoValues (_ a:inout T,_ b:inout T){ 令tempA = a a = b b =温度 } 该函数的通用版本使用占位符类型名称(在这种情况下称为T ),而不是实际的类型名称(例如Int , String或Double )。 占位符类型名称并没有说明T必须是什么,但它确实说a和b必须具有相同的T类型,无论T代表什么。 每次swapTwoValues(_:_:)函数时, swapTwoValues(_:_:)确定要代替T使用的实际类型。 泛型函数和非泛型函数之间的另一个区别是,泛型函数的名称( swapTwoValues(_:_:) )后跟尖括号( )中的占位符类型名称( T )。 方括号告诉Swift, T是swapTwoValues(_:_:)函数定义中的占位符类型名称。 因为T是一个占位符,所以Swift不会查找名为T的实际类型。 在大多数情况下,类型参数具有描述性名称,例如Dictionary Key和Value和Array ,它向读者介绍类型参数与其所使用的泛型类型或函数之间的关系。但是,当它们之间没有有意义的关系时,通常使用单个字母(例如T , U和V来命名它们,例如下面的class中的T 除了编写有关泛型的理论外,我们不妨看一下用例,但对于那些需要更多详细信息的人,请参考本文下面给出的链接。 为什么我们需要LRU Cache,甚至是通用的。为什么? 让我们考虑一下它在我们的应用程序中的使用。 显示基于用户使用情况的列表。 基于用户使用情况的功能顺序。 应用程序设置选项基于它的频繁使用。 根据用户的应用使用情况在Android手机上创建触摸biz屏幕。 在列表视图中显示大量图像 将大文本内容加载到内存中 […]