如果您开始使用Swift开发iOS或OS X应用程序,也许DDLog这个词不会引起您的注意,但是您不必担心,如果您不使用DDLog可以代替NSLog(除其他外)希望您的日志在版本中可读。 出于多种原因,实际上不建议发布带有日志的应用程序,例如: NSLog由于其同步性而减慢了应用程序的速度 通常会记录网络请求,并且您可能不希望其他人知道您的后端如何工作 您肯定会注意到的另一件事是, 您不需要每次都拥有所有日志 ,实际上调试过程通常是这样构造的: 构建应用 降落在您需要测试的视图(或其他任何视图)上 清除日志控制台 做测试并查看日志 一种简单的解决方案是使用彩色原木,但是一旦使用了已知的7或8种颜色,就必须对不同的原木重新使用相同的颜色。 如果您是一个知道超过8种颜色的女孩,则可以这样做(也许是因为这样,女人在编码方面比男人要好?:D),但至少我需要找出一种更好的方法。 所以让我们回顾一下到目前为止 我们仅在必要时才需要日志 我们不希望发布日志 我们如何才能有效地解决这个问题? 当然有枚举。 问题 让我们想象一下,我们有一个从后端检索并希望在TableView中显示的小猫的列表。 我们要登录 网络请求和响应 关于视图的操作(显示一个新的单元格,点击一个单元格,等等) 并且我们不希望手动导航我们的应用程序,直到包含TableView的视图控制器为止(是的,我们很懒惰)。 解 这是代码 基本上,每种类型的日志都有一个大小写,因此我们可以使用isEnabled和#if DEBUG阻止释放中启用任何大小写的功能来分别打开和关闭它们。 您可能已经注意到,枚举名称是Test而不是Log 。 那是因为: 我发现阅读诸如Test.kittensNetworkService.stuff()之类的内容更容易理解 此解决方案不仅限于日志:请记住,在小猫VC之前我们不手动导航? 用法 我们要记录所选单元格的indexPath吗? 我们要导航到KittensVC吗? 如果我们需要在任何情况下执行某项操作,则可以使用performBlockFor方法 PS: 要使用#if DEBUG宏,我们必须在目标/ Swift编译器-自定义标志/其他swift标志的Build阶段中添加值-D DEBUG。 感谢您的阅读,直到这里,我希望您像我一样喜欢这种解决方案🙂
大家好, 欢迎来到一年中最恐怖的时刻。 就像其他孩子一样,我的孩子绝对喜欢万圣节。 没有其他日子可以在一个晚上吃大量的糖果。 当然,作为父母,我帮助他们通过吃糖果来完成糖果finish 就像孩子们得到很多糖果一样,我所有的开发者朋友都将在我的Udemy课程上获得丰厚的收益。 在两天内,我所有的课程仅需10美元 。 是的,您没有误读此文,所以让我再重复一次。 我所有的Udemy课程都只需$ 10。 这笔交易将于2017年11月1日到期。请查看以下我的精彩课程: 掌握iOS版ARKit 精通iOS版Core ML 使用Vapor 2掌握服务器端Swift 使用Java Spring Boot框架掌握微服务 使用Kitura掌握服务器端Swift 在iOS中学习控制器的完整指南 希望您喜欢这些课程, 度过令人陶醉的万圣节之夜! 谢谢, Azam
我们在App开发人员博客上的最新文章之一介绍了Vapor,Kitura和Perfect –三种出色的Swift框架的比较研究。 2年前,才刚刚在服务器端领域使用Swift。 在Swift逐渐成为移动应用程序开发的潜在参与者的同时,服务器端Swift也对开发人员寄予了很高的期望,希望开发出一种完全由Swift在前端和后端驱动的产品。 这个想法似乎对开发社区很有吸引力,并且得到了IBM,Qutheory,PerfectlySoft等组织的大力支持。 Swift快速,这就是为什么它在开发领域占据了最大份额的原因。 随着新服务器端功能的推出,让我们探讨一下哪些框架可以为其提供最佳支持。 汽 由Qutheory团队开发的Vapor是唯一纯粹支持Swift的框架。 Vapor于2016年初推出,拥有一个非常活跃的社区。 Vapor受欢迎的主要原因在于,它为开发人员提供了可可开发人员熟悉的环境。 它为开发人员提供了一个独立的环境,由于其语法简单,因此易于阅读。 API的开发非常简单,因为它们是在Swift中独家开发的,而且可读性更高。 它的某些功能使其比竞争对手更胜一筹,例如它支持Apple的Push Notification Service,并促进SMTP发送电子邮件。 当我们谈论Vapor的数据库支持时,精通Swift的开发人员可以使它与任何数据库一起使用。 它提供了一组本机连接器,用于连接MySQL,PostgreSQL,Sqlite,Redis和MongoDB。 蒸气标榜自己独有的功能: 它支持诸如Mustache和Markdown之类的模板引擎,同时还具有称为Leaf的本机模板引擎,这使其非常自立。 蒸气专门提供SwiftyBeaver集成。 命令行工具,可轻松创建和操作现有项目 独有的工具库使创建命令行应用程序变得容易。 蒸气是当今最大的社区,因为其语法非常适合初学者。 活跃的社区使Vapor框架的采用变得更加容易,因为有许多教育资料可供使用。 它的排他性是由它除了Swift之外不使用其他任何库这一事实所驱动。 目前,Vapor框架的Github追随者达到了13k,使其成为服务器端工作非常流行的框架。 完善 快速且大型的服务器端脚本的功能丰富的框架。 它的很大一部分归因于它是由Apple本身的前Lasso语言团队开发的。 该团队具有多年的服务器端技术经验。 它为其开源社区关注者提供了5个不同的GitHub库。 仓库是 PerfectlySoft-框架和引擎 PerfectExamples —示例项目 SwiftORM —数据库连接器 PerfectServers-已经编写的应用程序,可以立即进行配置和部署。 Perfect秉承其名称,并为用户提供了众多功能,包括路由,SSL,模板引擎(例如Mustache,Markdown,JSON),但没有像Vapor这样的本地模板引擎。 对于电子邮件支持,它提供了SMTP以及MqTT,还启用了Apple Push Notifications。 它总是更接近Vapor,但没有本地路由类型验证和命令行扩展支持。 由于功能强大,Perfect的社区支持正在迅速增加。 数据库支持范围很广,远不如Vapor。 该框架支持MySQL,SQLite,PostgreSQL,MariaDB,MongoDB,Redis,CouchDB和FileMaker。 对于安全性和身份验证功能的实现,框架取决于Turnstile。 该框架非常适合即时设置登录Facebook,Google,LinkedIN,Slack和GitHub的登录名。 Perfect的排他性在于本机cURL包装器,并允许开发人员使用各种文件格式,目录类型和Zip文件保存。 已经编写的应用程序是开发人员需要准备部署代码的地方的附加优点。 它还提供对Swift代码的支持,并提供拖放样式以促进快速部署。 其专用的IDE SCADE允许开发人员创建可在iOS和Android平台上使用的混合代码。 SCADE使之成为可能,因为它以可执行格式分别为iOS和Android编译了相同的代码。 […]
使用样式处理iOS依赖项 首先:什么是迦太基? 如果您到达此职位,则很可能您已经知道了,但是如果您没有,我很高兴您能成功! Carthage是用Swift编写的依赖项管理器 。 它建立了依赖关系并为您提供了二进制框架 ,但是您保留了对项目结构和设置的完全控制 ,Carthage不会自动修改项目文件或构建设置。 如果您想了解更多关于为什么要在其他替代品上使用迦太基以及如何开始使用它的信息,我建议您阅读雷·温德利希(Ray Wenderlich)的这篇文章,它不会出错。 3个简单步骤: 1.安装自制软件 2.运行 酿造更新 3.运行 酿造安装迦太基 (即使这看起来太多了,在Wolox,我们也有脚本来安装一些有用的东西,其中包括迦太基。) 另外,我们建议您按照本指南添加自动完成功能。 有时,迦太基会给您类似“请更新到最新的迦太基版本…”之类的消息。 在这种情况下,您需要通过运行以下命令进行更新: 酿造更新 酿造升级迦太基 如果出现错误,则可以运行: 酿造更新 酿造重装迦太基 向项目添加第一个依赖项 有史以来第一次依赖吗? 只需按照以下步骤。 1.创建一个Cartfile和/或Cartfile.private文件。 Cartfile就像Gemfile,Dockerfile,Podfile以及其他所有文件一样。 在这里可以指定所需的依赖项及其兼容版本。 Cartfile.private就像一个Cartfile,但是对于不需要运行该应用程序的私有依赖项(例如,用于测试的依赖项)。 迦太基使用语义版本控制,请查看如何使用它。 2.运行以下命令[更改所用操作系统的平台] 迦太基更新–no-use-binaries –platform iOS 此后,将下载依赖项并将其存储在Carthage文件夹中。 还将生成一个Cartfile.resolved文件,该文件存储为每个依赖项下载的确切版本。 update命令将搜索满足您的版本限制的最新版本并下载。 3.将下载的框架添加到带有库的链接二进制文件构建阶段 在列表中,您应该添加出现在Carthage / Builds / 文件夹中的所有.framework软件包。 在其中,您会找到在Cartfile中声明的依存关系以及它们自己的依存关系。 4.在每个具有依赖项的目标中都有一个“迦太基”运行脚本构建阶段[仅当您的项目不是框架时才需要执行此步骤] 在脚本中,您应该编写:/ usr / local / bin / […]
完成框架后,您可能希望与Cocoapods共享它,以便每个人都可以轻松安装您的框架。 您的框架可能包含图像,gif或某些捆绑文件,本教程将显示如何通过pod.spec将资源包括到Cocoapods中。 顺便说一句,处理Cocoapods可能涉及一些基本的终端命令,如果您不熟悉终端,我建议您去找一些有关它的教程,因为在本教程中,我将不做详细解释。 在本教程中,我们将从头开始,创建一个GitHub存储库并编写一个名为SAProgressHUB的框架,最后,与Cocoapods共享它。 首先,让我们创建一个名称为SAProgressHUB的GitHub存储库。 不要忘记创建许可证。 现在,只需git将此存储库克隆到本地文件夹即可。 $ cd〜/ Documents / Hank_Private / $ git clone git@github.com:bbkaf / SAProgressHUB.git //下载成功后$ cd SAProgressHUB / $ ls -al 我们将创建.gitignore。 只需使用vim创建.gitignore和过去的gitognore https://github.com/github/gitignore/blob/master/Swift.gitignore $ vim .gitignore $ git add .gitignore $ git commit -m“添加.gitignore” $ git push 好的,现在让我们启动Xcode来创建我们的框架。 文件新项目选择“ Cocoa Touch Framework”。 使用GitHub存储库的名称来命名项目,使用不同的名称可能会给您带来混乱,我认为您不喜欢这样做。 现在让我们检查框架路径并进行提交,然后将其推送到GitHub $ ls -al $ git […]
本文是有关PHP缺失位的系列文章的第一篇。 以后的文章将讨论其他类型的概念,例如访问器和数据类型。 PHP 7.2即将来临,带来了与类型相关的更改,例如签名中的object类型或参数类型扩展。 这些证实了PHP社区加强PHP类型系统并提高类型安全性的意愿。 在Libcast,我们赞赏这些更改,这些更改使您可以依靠IDE在键入时显示类型错误,并在编译时验证类型,从而减少了查找和修复错误所需的时间 。 我们希望泛型是一项功能,希望不久后可以使用PHP,并允许使用给定类型的泛型容器。 泛型 泛型类允许声明必须在使用时专用的泛型容器 (您不能直接使用泛型类)。 任何类型都可以专用于泛型类,只要它们尊重泛型类中使用的签名即可。 泛型类可以使用几种泛型类型,然后仅通过修复泛型类型的子集来进行部分专业化 。 PHP中的泛型 RFC正在草拟中,但尚未被接受。 黑客/ HHVM 已经采用的泛型。 ircmaxell在PHP用户环境中进行了一个有趣的实验(当然,请勿在产品中使用此功能)。 泛型在PHP中对于容器非常有用:抽象数据类型(堆栈,队列,地图等)和域容器(日期集,一组人等)。 它们还将允许更精确的签名:目前,PHP可以iterable地在签名中声明集合,但是通用声明iterable可以使我们仅要求书本集合。 Libcast的仿制药案例 我们创建了一个Libcast新安全视频平台API的模拟模型,在该模型中,我们需要随机生成数据,但有时需要遵循给定的分发方式。 例如,我们想要生成每个具有给定机会被发射的域事件,从而在模拟中生成真实的数据 。 我们还希望根据当前访客群的真实地理分布来模拟假访客。 我们看到了一个机会,可以根据普通类中的分布来提取做出选择的部分。 这是处理引用的示例的简化的第一枪: //生成IP地址 最终课程IpGenerator { 公共函数generate(string $ countryCode =’FR’):IP { // … } } 最后一个类DistributedIpGenerator { / ** @var IpGenerator * / 私人发电机 / ** @var数组* / 私人$发行; […]
这篇文章由IssueHunt策划, 它是一个开源项目的众筹和采购平台。 任何人都可以在GitHub上资助任何问题,这些钱将分配给维护者和贡献者。 https://issuehunt.io/ Schedule是一种现代且示例性的轻量级任务计划程序快速计时器。 它使您可以使用人性化的语法来操作定时活动。 功能包括:日程安排规则,人类可读时间段分析,基于标签的标签管理,cake child-action添加/删除以及对生命周期的完全控制。 使用计划的原因:有效的基于间隔的计划,基于日期的计划,任务管理和寄生 时间表/时间表 a这就是快速计时器的外观。 通过在…上创建帐户来为jianstm / Schedule开发做出贡献 github.com DifferenceKit是Swift集合的快速且灵活的O(n)差异算法平台。 该算法是根据Paul Heckel的算法进行编程的。 功能:自动计算用于UITableView以及UICollectionView的批处理更新的命令; 分段线性收集; 计算差异,甚至包含重复元素的差异。 优点:计算线性时间中的所有差异类型。 文档是由爵士乐产生的,因此令人赞叹。 DifferenceKit产生更好的性能。 ra1028 / DifferenceKit for用于Swift收集的快速灵活的O(n)差异算法框架。 – ra1028 / DifferenceKit github.com Penc是窗口管理器,它是针对macOS的触控板。 代替键盘的复杂快捷键,可以对Penc进行编程以使用触控板。 用法:要激活Penc,只需双击并按住Command键(⌘) 使用当前的dmg文件完成下载和安装 该框架支持macOS High Sierra(10.13)。 杜古卡纳克 适用于macOS的基于触控板的窗口管理器。 通过在GitHub上创建一个帐户为dgurkaynak / Penc开发做出贡献。 github.com iina是macOS的当前视频播放器。 功能:现代macOS(10.11+),可自定义的用户界面,画中画,缩略图预览,MPV配置文件以及脚本系统,可自定义的键盘,独立音乐模式。 构建:使用预编译的dylib,或者您可以使用最新的mpv。 lhc70000 / iina 适用于macOS的现代视频播放器。 通过在GitHub上创建一个帐户为lhc70000 / […]
在本系列文章的后续部分,我将继续研究新的拖放方法,我将另一个简单的游戏组合在一起,该游戏构建了一个空投文件的马赛克,使您有机会进行重新组合并将其重组为讨价还价。 [摇动iPad扰乱图像]。 为此,您需要先编辑info.plist,然后添加应用所需的代码以重新协调针对该图像的图像。 UTExportedTypeDeclarations UTTypeConformsTo public.data UTTypeIdentifier ch.cqd.mosaicMaker UTTypeTagSpecification public.filename-extension mosaicMaker 这就是说,当您获得以.mosaicMaker结尾的文档时,您需要打开此应用程序。 当然,这意味着我需要更改要空投的jpg的扩展名,对不起,其中最纯粹的人不是。 添加的内容是,我需要将此代码放入应用程序委托中,以对传入的文件进行处理。是的,将扩展名更改回jpg。 显然,如果您将其发送给png,它将无法正常工作! func application(_ app:UIApplication,打开url:URL,选项:[UIApplicationOpenURLOptionsKey:Any] = [:])-> Bool { var destinationPath:URL! 让documentsDirectoryURL =试试! FileManager()。url(用于:.documentDirectory,位于:.userDomainMask中,适当用于:nil,创建:true) 如果url.pathExtension ==“ mosaicMaker” { 让documentsDirectoryURL =试试! FileManager()。url(用于:.documentDirectory,位于:.userDomainMask中,适当用于:nil,创建:true) 做{ destinationPath = documentsDirectoryURL.appendingPathComponent(“ mosaic.jpg”) 尝试FileManager.default.moveItem(at:url,to:destinationPath) } { 打印(错误) } } 让nc = NotificationCenter.default nc.post(name:Notification.Name(rawValue:” showImage”), 对象:无,userInfo:无) 返回真 } 除此之外,它还使用iOS标准通知中心来告诉ViewController它已加载了需要显示的图像。 在View […]
在本教程中,我们将说明如何在iPhone IOS 11中的同一屏幕上的两个集合视图中拖放集合视图单元格。在IOS 11中,苹果引入了两种协议类型UICollectionViewDragDelegate和UICollectionViewDropDelegate,通过使用这些协议方法,我们可以将一个集合视图单元格从一个集合视图拖放到另一个集合视图。 注意:-请注意, iPhone和iPad均支持拖放功能,在iPad上,不同应用程序,同一应用程序和同一屏幕之间可使用拖放功能,但在iPhone中,仅可在相似屏幕上使用拖放功能。 首先创建基础项目 通过使用CollectionViewDataSource和CollectionViewDelegate方法在同一屏幕上创建带有两个collectionView的基础项目。 您可以从此处下载基础项目。 现在,我们开始拖放代理,将CollectionViewCell从FirstCollectionView移至SecondCollectionView。 拖动集合视图单元格(UICollectionViewDragDelegateprotocol) 首先,我们需要实现拖动委托的itemsForBeginning方法,其中我们需要返回UIDragItem的数组。 注意:-必须记住将dragDelegate设置为self。 并启用dragInteraction。 override func viewDidLoad() { super.viewDidLoad() topCollectionView?.dragDelegate = self topCollectionView.dragInteractionEnabled = true } itemsForBeginning- >提供项目以开始与给定indexPath相关联的拖动。 如果返回一个空数组,则拖动会话将不会开始。 为了创建UIDragItem,首先我们需要创建NSItemProvider,并将该项目提供者传递到UIDragItem(itemProvider 🙂 extension ViewController: UICollectionViewDragDelegate { func collectionView(_ collectionView: UICollectionView, itemsForBeginning session: UIDragSession, at indexPath: IndexPath) -> [UIDragItem] { let dragItem = self.dragItem(forPhotoAt: indexPath) return [dragItem] […]
Hola技术人员,直到现在我们所有人都已经阅读了许多有关最酷的主题泛型的博客和文章,但仍然有模糊的想法吗? 让我们尝试再次擦拭灰尘。 通用功能使程序更灵活,可重用和可伸缩,可以与任何类型的数据类型一起使用。 泛型是Swift非常强大的功能。 大多数基于泛型的库和框架。 甚至我们在日常编码生活中都使用了泛型而不了解它。 示例:数组和字典都是swift的通用集合类型,它们可以容纳任何类型的数据类型,例如Int,String,CGPoint等。让我们不必过多谈直接进入一些实际的东西。 让我们编码… 假设我们有一个电子商务应用程序,并且必须在该应用程序上的大部分位置显示金额标签,并且金额也来自服务器,而该服务器也不是特定的数据类型,有时是Int,Float,Double并可能是String本身。 因此,我们通常要做的是。 每次都厌倦了类型转换,如果我们得到一个函数,可以传递任何类型的数据类型,该函数会将其转换为带有$($)的字符串,以便将其直接传递给我们的UILabels或UIButtons。 是不是很酷。 在上面的扩展中,我们符合我们的协议,在该协议中,我们还将返回Double和String的转换,并附加了美元货币。 我们必须对所有数据类型实施相同的操作。 现在将在我们的Utilities类或Global类中编写一个全局函数amountText ,可以在整个项目中访问它而无需创建任何实例。 将使此函数公开,以便它也可以在模块外部使用,默认情况下,它将在内部使用,因此不能在定义模块之外使用。 此函数将采用通用数据类型,该数据类型均符合我们的协议AmountConversion 。 现在,使用我们的标签和按钮检查它是否可以接受。 来吧,我们来创建一个UILabel和一些带有若干数据类型的实例。 这是可以预期的数量。 并尝试直接将其与标签文本一起传递。 在这里,我们在协议中创建了一个初始化程序,这将有助于我们在通用方法中返回默认值,将在下一节中讨论它。 再次来到您的Utility或Global类,并编写一个通用方法。 它将接受所有符合我们的协议UnwrapOptional的任何类型的参数。 现在让我们创建一些可选的变量,并检查我们的函数是否给出了预期的结果。 下面一些变量具有值,而另一些则为零,让我们看看函数返回给我们什么值。 哇哈哈! 我们得到了期望的输出。 现在将进一步扩展此功能。 如果我们有任何自定义类或自定义类,在其中也有可选的var可以使用,那么它也可以是可选的链接。 能行吗 我们来看看 我有电影类,现在有一些可选变量尝试用电影类型的实例解开可选对象。 YOOO,之所以起作用,是因为最终我们试图解包已经符合我们的UnwrapOptional协议的字符串或指定的数据类型。 现在查看是否尝试解开Movie类的实例。 没运气! 它将出现错误“在参数类型’电影?’中,’电影’与预期的类型’UnwrapOptional’不符” 因此,在这里我们必须使我们的类符合协议。 并且它将为类添加必需的init,因为我们的UnwrapOptional协议具有自己的构造函数,可返回自定义类的默认值。 是的,任务完成了。 现在,我们可以尝试使用可选链接获取值。 抢啤酒! 干杯! 它的工作原理,足以满足一天的学习需求。 好了,我们了解了泛型如何与协议握手,并解决了许多问题。 泛型有很多附带功能。 欢迎反馈。