Tag: swift

选择第二种语言:Swift To Python

为什么选择Python以及它的样子 Swift是开始工作的好方法。 我从来没有写过一行代码。 作为一个完整的编程初学者,花了13个月的时间进行设计,自学,编码,重新编码,然后启动我的第一个完整应用程序。 我为此感到无比自豪,这是人们每天都在玩的新颖游戏。 除了保持最新状态并推出新功能外,任务还很完整。 现在有这个东西。 一旦我变得根深蒂固地思考代码,就可以用这种技能来完成所有可能的事情。 在这种情况下,仅了解Swift的问题也变得显而易见。 尽管我喜欢Apple生态系统,但通过编写Swift代码,我只能覆盖50%的移动用户和不到4%的桌面用户。 我要编写的下一个软件是台式机软件。 这些是我主要为自己创建的程序,但是还有很多其他人可以从中受益。 如果用Swift编写它们,则只能覆盖4%的用户。 如果我用Python编写它们,几乎可以接触到所有人。 为什么是Python? 我可以达到更大的用户群。 有些工具在Python中可用,而在Swift中可能永远无法使用。 对我来说,那个库是Tensorflow。 有大量的稳定框架可用。 我可以为台式机,网络甚至移动设备编写Python。 不是说我会为手机编写它。 我可能不会,但是选项在那里。 您几乎要问的每个问题都已经在StackOverflow上得到了解答。 SO上的Python标签:〜596k。 SO上的Swift标签:〜100k 这需要多长时间? 比使用第一语言的时间要少得多。 几天之内,您就可以编写出基本的软件。 语法如何比较? 非常相似。 点表示法,函数参数以及您编写的许多代码看起来都一样。 空格是Python使一切保持秩序的方式。 您将不会使用方括号来打开和关闭函数或类。 这意味着,起初,一切都会看起来很杂乱。 最大的挑战是什么? 命令行。 我对命令行并不感到陌生,但是Python需要一定水平。 带有它的学习曲线可能会令人沮丧,但没有什么不同。 您做得越多,就越容易。 Python文档不那么友好,它没有像Xcode这样的强大IDE。 大多数语言都没有。 进行设置并习惯于新的IDE。 PyCharm是我的选择。 我设法从Xcode移植了大多数语法颜色设置和键绑定。 这是一个持续的过程。 如果您过于依赖UI的故事板,那么使用新语言会困难得多。 故事板可能很棒,但我建议在没有代码的情况下进行所有UI操作时,请不要使用所有UI。 编程界就是这样做的。 签出此内容以使用没有情节提要的面板,并查看代码中的布局对齐方式。 与其他IDE相比,Xcode中的自动完成和预测功能令人难以置信。 直到我开始为别人购物时,我才意识到自己有多依赖。 我输入的内容比使用Swift时要多。 我是否已经停下来质疑这是否是一个好的决定? 是。 但是到目前为止,只有一个原因。 […]

Swift中的二叉树

Binary Tree的极大好处是可以增加搜寻的效率。 如果一个array = [10, 5, 7, 14, 11, 20] 10,5,7,14,11,20 array = [10, 5, 7, 14, 11, 20] ,我每次都要从头搜寻一遍,时间复杂度为O(n) 。 但是如果我用Binary Tree,时间复杂度就会下降到O(log n) 。 节点的结构

使用iOS应用程序抓取Firebase服务

那是晴天的时候之一,那时我回到家,终于有时间从我的购物清单中计划好美食应用程序。 不管是好是坏,我不仅需要进行应用程序设计,而且: 身份验证。 我可以在其中保存和检索内容(数据,信息,图像)的数据库。 可搜索的食品API。 大概,我需要一个认真的人加入我自己的小团队。 或者,我可以一个人做吗? 或多或少😃。 简短答案-是的! 因为我一方面找到了价格合理的可搜索食物API,另一方面又找到了Firebase 。 长答案? 继续阅读! Firebase是面向移动开发人员的统一平台(是的,适用于Android和iOS),提供了许多很棒的功能,其中包括实时数据库,崩溃报告,分析,身份验证等。最好在以下位置查看整个列表:他们的官方网站。 我写的最后一篇文章包括一个项目 名为Unicorner,旨在接收带有Unicorner用户看到并拍照的独角兽图像的远程通知。 这次,该项目将要拍摄独角兽的图片并将其上传到数据库。 然后,来自数据库的数据将被馈送到一个列表,在该列表中可以看到上传的图片和信息。 通知不会发送,但我们可以在另一篇文章中进行处理,对吗? 无论如何,这是计划的文章工作流程: Firebase帐户注册和iOS应用程序配置。 在Xcode中设置Demo项目。 编写一些代码以与Firebase实时数据库和存储进行通信。 实际上,这很简单。 首先转到此链接,然后单击屏幕右上方的“ 登录”按钮。 可以使用gmail帐户( 大多数人都拥有一个 )登录,也可以按照注册步骤创建新帐户来登录。 完成后,再次点击右上方的转到控制台 , 进入 Firebase控制台。 这是可见的: 我的Firebase控制台中已经有一个正在处理的应用程序项目。 要添加另一个,只需点击添加项目,然后看到此模式: 我为我的项目选择的名称是UnicornUploader和 我选择的地区是美国。 根据需要选择,然后单击创建项目 。 在创建项目时稍等一下,瞧: 点击“ 继续”后 ,您将进入“ 项目概述”页面: 在这里可以访问Firebase提供的所有功能。 确实,在本文中,我将仅关注三个方面-身份验证,数据库和存储。 您确保在时间允许的情况下将它们全部检查出来。 将Firebase添加到iOS应用 是时候选择将Firebase添加到您的iOS 应用程序中,以将Firebase添加到我的iOS应用程序中 : 我已经输入了演示项目的iOS Bundle ID,对您的演示文稿也做了同样的操作,然后点击Register […]

关于配置和启动API服务器的实用指南-完美

有很多方法可以配置和启动Perfect Server。 本指南介绍了用会话 , 路由 , 过滤器和日志记录配置Perfect服务器的最佳实践。 届会 如果我们计划在服务器端Swift上进行会话,则需要在启动服务器之前对其进行配置。 这是我的示例配置,可以根据您的需求进行自定义: 另外,我们需要调用let sessionDriver = SessionMySQLDriver()来配置会话过滤器,并使用purgeInterval来清除停滞的会话。 CORS 为了使您的API与单页面应用程序(react,vue.js或Angular)一起使用,我们需要配置跨域引用共享(CORS) 。 您可以在此处阅读有关CORS的信息: 跨域资源共享(CORS) 跨域资源共享(CORS)是一种使用其他HTTP标头让用户代理获得…的机制。 developer.mozilla.org 以下是CORS配置的工作示例。 启动服务器之前,我们可以在主目录中调用CORS.configure() 。 确保定义了所有自定义的HTTP标头和可接受的主机名,否则将不接受Web客户端使用您的api! 👈 CSRF 跨站点请求伪造(CSRF)是一种攻击,它迫使最终用户在当前已通过身份验证的Web应用程序上执行不需要的操作。 CSRF攻击专门针对状态更改请求而不是数据盗窃,因为攻击者无法看到对伪造请求的响应。 您可以在此处阅读有关CSRF的信息: 跨站请求伪造(CSRF)– OWASP 跨站请求伪造(CSRF)是一种攻击,迫使最终用户在Web应用程序上执行不需要的操作… www.owasp.org 为了避免CSRF攻击,我们需要配置服务器。 以下是可以根据需要自定义的示例。 我们可以在启动服务器之前在主目录中调用CSRF.configure() 。 模式初始化 由于我们需要会话和数据库连接,因此需要在启动服务器之前对其进行配置。 我们可以将数据库,SMTP,会话等的所有配置都放在JSON并使用它来配置我们的服务器。 我们可以有针对不同环境的配置。 以下示例显示了如何为macOS和Linux不同地配置服务器: 典型的配置文件如下所示: 然后,我们可以像下面这样设置DB , session和SMPT配置: let opts = initSchema(fname) 这还会返回启动服务器时将使用的baseURL , httPort …。 […]

第3部分:安装自定义日志管理器

欢迎使用第3部分:安装自定义日志管理器 如果需要检查第2部分,请继续 。 首先,什么是SwiftyBeaver? SwiftyBeaver是基于Swift的iOS和macOS日志记录框架。 SwiftyBeaver具有不同类型的日志消息,我们还可以过滤日志以使错误检查更加轻松。 它有一个免费的许可计划。 那不是全部。 出站日志信息保存在云中。 SwiftyBeaver带有一个macOS应用程序,可让我们实时查看日志。 SwiftyBeaver日志记录框架可以使用您选择的安装工具安装在每台Apple设备以及Swift 2和Swift 3上 。 对于Swift 3,请安装最新的SwiftyBeaver版本 对于Swift 2,安装SwiftyBeaver 0.7 在第3部分中,我们将为项目配置SwiftyBeaver。 云设置 完成注册SwiftyBeaver首选项菜单后,您将需要生成新的凭据。 File> New SwiftyBeaver保存本地日志文件。 但是我没有必要的信息。 保存的位置并不重要,但是请不要忘记此位置。 单击“ 生成新的应用程序凭据”按钮时,您应该看到我们应用程序的应用程序ID , 应用程序秘密和加密密钥 。 让我们使用AppDelegate定义这些信息。 安装SwiftyBeaver Logging Framework之后,只需在AppDelegate.swift的顶部添加以下3行: 导入SwiftyBeaver 让日志= SwiftyBeaver.self AppDelegate:didFinishLaunchingWithOptions()添加您要在整个应用程序中使用的SwiftyBeaver日志目标(控制台,文件等): //添加日志目标。 至少需要一个! let console = ConsoleDestination()//登录到Xcode控制台 let file = FileDestination()//登录到默认的swiftybeaver.log文件 log.addDestination(控制台) log.addDestination(文件) 要开始记录到平台,您只需要使用您的凭据启动SBPlatformDestination() ,可以选择调整属性,然后将该实例添加到SwiftyBeaver本身。 让平台= […]

将图像制作成圆形或圆形的iOS

此示例显示如何制作一个用如下半径四舍五入的UIView或UIImageView: 目标C someImageView.layer.cornerRadius = CGRectGetHeight(someImageView.frame)/ 2; someImageView.clipsToBounds = YES; 迅速 someImageView.layer.cornerRadius = someImageView.frame.height / 2 someImageView.layer.shouldRasterize = true someImageView.clipsToBounds = true 建议如果使用自动布局,则将someImageView.layer.cornerRadius代码放入viewDidLayoutSubviews中。 如果图像更改大小,这将允许更新图像的cornerRadius。 覆盖func viewDidLayoutSubviews(){ super.viewDidLayoutSubviews() someImageView.layer.cornerRadius = someImageView.frame.size.width / 2 someImageView.layer.masksToBounds = true }

UIStackView:垂直轴肖像,水平轴风景

您是否曾经使用过UIStackView,并认为“ Jeez,此垂直堆栈视图在人像上看起来确实不错,但在风景上看起来像是一场灾难。 如果我能使它在肖像上垂直但在风景上水平……” 好吧,本教程适合您! 😁 如果您只想看技巧,请跳至第2部分! 第1部分仅介绍如何进行设置。 第1部分:设置 从一个名为“ Single View Application”的新项目开始,然后直接跳入Main.storyboard文件。 将UIImageView插入到View Controller的任何位置,添加所需的任何图像。 我选择了柏拉图的图像。 确保将要使用的任何图像都放在项目的Assets目录中,以便该图像显示在“图像选择”中! 2. 在UIImageView下面插入一个标签。 将行数设置为0,并将换行符设置为自动换行。 将行数设置为0允许多行文本。 标签将根据文本的数量占用其需要的任意数量的行。 如果您不知道标签上要显示多少文本,这对动态文本很有用。 将换行设置为自动换行可以使文本在完整的单词处换行。 3. 将UIImageView和Label嵌入到堆栈视图中。 有很多方法可以做到这一点。 在按住Cmd的同时单击图像和标签,然后按底部的堆栈图标。 4. 在堆栈视图上设置约束。 在文档轮廓上选择堆栈视图,然后设置水平和垂直约束。 我选择了:尾随= 5,领先= 5,顶部空格= 20 5. 在堆栈视图上,将“对齐方式”设置为“ 填充” ,将“分布”设置为“ 均等填充”。 将“对齐方式”设置为“ 填充”可使每个项目完全填充垂直于堆栈视图轴的可用空间。 将“分布”设置为“均等填充”可使堆栈视图中的每个项目均等地沿其轴填充空间。 如果需要,请添加一些间距。 我加了3。 6. 在标签上添加一些文本。 好的。 全部设置好了。 😤 第2部分:垂直轴肖像,水平轴风景 要更改堆栈视图在横向上的显示方式,我们需要实现特质变化。 “特征变化”根据设备的配置呈现不同的UI。 在这种情况下,您希望堆栈视图在不同的设备方向(纵向和横向)上看起来有所不同。 在文档大纲上选择堆栈视图后,单击“轴”旁边的“ +”。 […]

用于多平台开发的模块化体系结构:第1部分

这是3部分系列的第1部分。 您可以在这里找到其他部分: 第2部分:接口和框架开发 第3部分:演示和UI 配套项目: Github 驯服海妖 截至2019年1月,苹果在全球范围内拥有14亿台有源设备。 我们中的许多人至少拥有2或3。我们会在一整天在Mac电脑上工作,在iPhone上浏览以及在Apple Watch上浏览之间切换。 我们希望连续性经验是无缝的。 跨平台存在巨大的机会。 但是,很多时候我们将开发工作仅集中在一个平台上。 我们担心会增加复杂性,增加预算和不合时宜的时间表。 我们害怕神话人物- 海妖 。 本文试图驯服怪物。 但是,它不是“快速致富”教程。 为多个平台构建应用程序意味着需要额外的维护,编码,测试,设计/ UX资源,以及将您的应用程序作为系统的全面综合的高级思考。 但是,通过正确的方法,应用一些最佳实践方法和技术,肯定可以以实际有效的方式实现。 下面的示例代表了一个更极端的情况,我们将为iPhone , Apple TV , Apple Watch和Apple TV构建一个幻灯片应用程序。 苹果硬件生态系统的四个触角可供开发。 下一次我们将离开第五台iPad 。 并希望将来HomePod , VR / AR眼镜甚至Apple Car能够完成Kraken缺少的触角。 您的海妖可能会有所不同。 它可能只是一个触手可及的一个iPhone应用程序。 这里讨论的许多原理(例如模块化)仍然适用并且非常有帮助。 继续阅读。 所有伟大的项目都始于良好的架构 建筑 幻灯片应用程序很简单:它将每隔几秒钟显示一次来自Unsplash的随机照片。 根据平台的不同,它还将显示摄影师的姓名,图像描述和喜欢的图像。 我们要做的第一件事是决定如何将所需的功能分解为各个组件以分离关注点。 在我们的案例中,有明确的界限。 将与Unsplash API通信的业务逻辑分离到其自己的模块中是有意义的。 我们将其称为ShowEngine 。 我们还可以将负责按一定时间间隔加载每个映像的运行循环代码分离到其自己的模块/类中,以更接近于单一职责原则。 但是对于这个简单的示例,我们将其放在一起。 […]

NSTimer的秘密世界

›也可以 在此链接的我的博客上找到本文 。 计时器允许我们在一个或多个计时器间隔后执行一些代码。 有多种类型的时钟可用于创建计时器,即使所有这些时钟显然都以相同的速率运行,它们的行为仍然不同。 我们可以列出以下计时器类型列表: 实时时钟或RTC 。 它是一个计算机时钟(通常为集成电路形式),用于跟踪当前时间。 用户可以任意更改此时钟,而NTP(网络时间协议)则最好使其与外部参考保持同步。 它的值每秒增加一秒钟,但有时可能会更快/更慢或向前跳跃( 这要感谢Gavin Eadie,这使我意识到时钟永远不会向后运行.NTP同步发现时钟在运行如果运行速度快,则在尝试与外部源同步时应放慢速度,直到“实时”赶上 。 单调计时器 。 它的计数器通过使用计时器中断发送到CPU的物理信号递增。 在Apple平台上,此值由Mach内核通过mach_absolute_time()返回。 返回值取决于CPU,因此您不能只将其乘以一个常数就可以得出真实值。 相反,您应该调用系统提供的转换函数将其转换为真实值(CoreAnimation有一个方便的方法:CACurrentMediaTime())。 它在启动时被重置的事实使得获取现实世界中流逝的时间并不那么有趣,但是它是测量两个时间间隔之间差异的最精确方法。 启动计时器 。 它只是一个特殊的单调计时器 ,在系统进入睡眠状态时不会暂停。 获取其值的最常见方法是从终端调用uptime函数。 在Apple平台上,创建计时器的最常见方法是使用NSTimer类。 实际上,它只是围绕单调计时器的包装。 因此,使用NSTimer可能会以无法预料的方式结束,特别是在iOS上,在如上所述的某些极端情况下,机会性的资源使用可能会结束。 为了充分理解NSTimer,我们需要谈一些NSRunLoop; 一旦启动,每个应用程序都会创建第一个NSThread,称为Main Thread; 每个线程都有一个关联的运行循环,该循环管理输入源,例如鼠标,键盘,触摸,连接……以及显然是我们的计时器。 您可以将RunLoop视为等待新消息并将其传递给适当的收件人的邮箱 :它基本上是一种消息传递机制,用于异步或线程间通信。 一些平台(如Windows)将其称为Message Pump,但内部概念仍然相同。 实际上, 运行循环代表了命令行 应用程序 与交互式 (通常是基于UI) 应用程序 之间的主要区别 。 当第一个使用参数启动时,执行它们的内容,然后退出,一个交互式应用程序等待用户输入,对此做出反应并再次等待。 每个线程只有一个Run循环; 一个运行循环由一组要监视的输入源(键盘,触摸等)和一组要通知的观察者组成。 隐式或显式地使用特定的运行模式初始化运行循环。 在其生命周期内, 仅监视与该模式关联的源并允许其传递事件; 仅将与该模式关联的观察者通知新数据。 Cocoa / UIKit定义了几种类型的模式:在iOS上,有一种特殊的模式称为UITrackingRunLoopMode:在控件中进行跟踪时设置。 […]

仍然想知道IBDesignable和IBInspectable是做什么的?

现在是2019年,XCode 10在这里,iOS 12在这里,但我们甚至没有提供通过XCode接口构建器为UIView / UIbutton或任何其他UIView子类提供圆角/边框半径/边框宽度的规定。 啊! 有点令人沮丧,对不对? 当然,我们可以通过编程来完成所有这些工作。 但是,请思考一下,为什么您可以编写一些原始代码并想象一下它的外观,当您可以轻松地在Interface Builder中修改值并使用IBDesignable和IBInspectable查看实时更改时! 在本文中,我将说明如何使用界面生成器添加边框颜色,边框宽度和角半径。 因此,让我们开始吧。 IBDesignable和IBInspectable 将@IBInspectable添加到属性时,它将在XCode中将该属性公开给属性检查器。 您可以在属性检查器中修改值,而不用编程方式进行修改。 但是,当您尝试更改值时,界面构建器将不会实时显示更改。 为了查看更改,您需要构建并运行项目。 但是,嘿! 这是聚会的把戏。 我们可以使用@IBDesignable来处理此问题,它会告诉XCode在您修改值时呈现实时更改。 现在,让我们看看下面的示例类。 导入UIKit @IBDesignable 类CustomView:UIView { @IBInspectable var borderColor:UIColor? { 得到{ 返回UIColor(cgColor:layer.borderColor!) } 设置{ layer.borderColor = newValue?.cgColor } } @IBInspectable var borderWidth:CGFloat { 得到{ 返回layer.borderWidth } 设置{ layer.borderWidth = newValue } } @IBInspectable var cornerRadius:CGFloat { […]