Tag: Ios开发

Swift入门:常量

在总体上开始进行Swift或iOS开发之前。 我想问一个简单的问题: “您为什么要成为应用程序开发人员?” 您对事物的运作方式着迷吗? 您是否想执行一个革命性的想法? 如果您知道如何编码,您是否相信可以找到更好的解决方案? 还是只是为了钱? 如果这是您要寻找的金钱部分,那么从长远来看,很容易使您失去动力。 您必须对自己想做的事充满热情。 您应该很好奇知道事情是如何工作的以及如何将整个想法转化为应用程序。 应用程序开发不是一项枯燥的工作,实际上,它是最具创造力的过程之一,并且每一步都令人愉快😃。 话虽如此,让我们开始为您提供最新形式(打字时为v4.2)的一些Swift优势。 先决条件 如果您有使用任何编程语言进行编码的经验,此博客将更加有趣。 哦,是的,您将需要一台装有最新Xcode的Mac。 但是,如果您没有Mac,请执行以下操作:http://online.swiftplayground.run/,它可以使您在任何地方运行swift! 因此,请转到xcode>开始使用游乐场,或者更好的方法是直接转到http://online.swiftplayground.run/进行学习和编码。 你好,世界! 众所周知,程序员遵循愚蠢的传统。 其中之一是编写hello world程序。 因此,Hello World的Swift 4.2语法就在这里! 打印(“ Hello,world!”) 就是这样! 那是一个迅速的完整程序! 容易吧? 现在让我们学习如何快速定义变量和常量。 常数 我们使用关键字let创建常量,并且常量的值只能分配一次。 就像是双AA电池,您可以使用一次。 让名称=“授予” 让luckyNumber = 7 令百分比= 90.4 我们还可以像其他编程语言一样在一行中编写所有内容: 让名称=“允许”,luckyNumber = 7,百分比= 90.4 好的,所以我上面写的三个语句很容易理解,但是这里有很多事情要做。 让我们解码: 您可以看到,我从未尝试将’name’定义为String或将’luckyNumber’定义为int或将’percentage’定义为double。 这是因为提供一个值有助于编译器推断其类型,这意味着当我定义let name =“ Amit”时 ,编译器会自动将’name’作为String类型。 这实际上是Swift语言的功能。 您可能已经观察到我以一种不寻常的方式编写了“ luckyNumber”,这是因为许多Swift编码人员更喜欢以camelCase的方式编写变量或函数的全名。 […]

适用于初学者的Swift Optionals

如果您是初学者,尽管可能已经找到了解决方法,但是Optionals可能很难理解。 在本文中,我们将探讨Swift Optionals背后的基本原理。 在开始之前,我假设您了解Swift的基础知识。 如果没有,请关注我的YouTube视频并返回此处。 与其他编程语言相比,Swift带来的主要优势之一是Optionals。 Optionals允许您将nil值存储在变量中,这在其他语言中几乎是不可能的。 如果在变量中找到nil值,程序将立即崩溃。 但是我们可以在Swift中使用Optionals来避免这种情况。 让我们看下面的分步示例。 让我们如下创建两个变量。 如您所见, myFirstName变量是一个可选变量,因为它有一个? 在变量之后。 即使myFirstName变量为nil,您也可以打印myFirstName和myLastName而不会出现任何问题。 您几乎无法使用任何其他编程语言来执行此操作,因为该应用程序将崩溃。 让myFirstName:字符串? =无 let myLastName:String =“ Mayu” print(myFirstName)//输出nil print(myLastName)//打印Mayu 因此,现在让我们为myFirstName变量分配一些值,并查看如何打印这些值。 如下所示,可选的myFirstName变量在打印中显示它是可选的。 我们将在课程结束时学习如何摆脱它。 让myFirstName:字符串? =“杰伊” let myLastName:String =“ Mayu” print(myFirstName)//打印可选的(“ Jay”) print(myLastName)//打印Mayu 我们还应该注意,我们不能让可选变量与其他变量交互,因为它不仅会起作用。 它可以使用String类型的变量,而不会导致应用程序崩溃,但是如果尝试使用其他变量类型,它将使应用程序崩溃。 请看下面基于int数据类型的示例。 让numberOfDogs:Int = 2 让numberOfCats:Int = 1 让numberOfParrots:整数? = 4 print(numberOfDogs)//打印2 print(numberOfCats)//打印1 print(numberOfParrots)//打印4 print(numberOfCats + numberOfDogs)//打印3 print(numberOfCats […]

Swift 5:快速概述

您可能知道,Apple刚刚发布了Swift 5,其中包括数十项更改。 让我们快速浏览一下通过此版本可以更好地开发哪些常规任务。 您将获得以下内容: 1.减小应用程序大小! 🥳 使用Swift 5编写并针对iOS 12.2,watchOS 5.2,tvOS 12.2编译的应用程序将不包含用于Swift标准库和Swift SDK的动态库。 这意味着应用程序大小将略有减小。 根据此推文,空项目的大小从2.4 MB减少到24 KB。 2.改变“ 尝试? ” 您肯定遇到了一个问题, 即使用try调用throwable函数返回Optional的结果? 是包装在两个Optional中的一种类型。 这不是很方便,所以在Swift 5中尝试吗? 返回仅包装在一个Optional中的类型。 在以前的版本中,您必须这样写: 让结果=尝试? optionalObject?.foo() // type(of:result)= SomeType ?? 使用Swift 5: 让结果=尝试? optionalObject?.foo() // type(of:result)= SomeType? 3.原始字符串 现在可以将双引号和反斜杠用作普通字符,而不用作特殊字符。 因此,为此,您应该在行的开头和结尾添加#符号。 例: let string1 =#“带单词的字符串放在”括号“”# 让string2 =#“带有\反斜杠的字符串”# 对于正则表达式,此功能非常有用: //快速4.2 let regex =“ [A-Z0-9a-z ._%+-] […]

iOS上的实时远程配置

需要快速推出“远程配置”更改时该怎么办? 也许您所做的最后更改没有奏效,您想尽快撤消它们。 否则您的应用出现问题,您需要禁用整个功能。 调用fetchWithExpirationDuration:completionHandler:更为频繁(有效期较短)是一种方法,但Firebase不建议这样做。 这样您就有被节流的风险。 如果您可以根据需要使Remote Config缓存无效,而不必对较短的到期时间进行硬编码怎么办? 不必反复要求服务器进行更新,而是让服务器在发生更改时通知您。 Firebase Remote Config现在与Cloud Functions集成,因此可以在发布或回滚配置时触发执行。 这意味着您可以使用一个函数向应用程序发送静默推送通知,以使其知道配置已更改。 静默推送通知将不会显示给用户,同时仍会触发AppDelegate中的回调。 您甚至可以通过将选项content_available设置为true来使iOS在推送通知到达时在后台启动您的应用程序(或恢复它)。 一个陷阱:如果用户手动将其杀死,iOS不会在后台启动您的应用程序。 这一直持续到下一次重启(第一次解锁后)。 除此之外,您真是太棒了。 实作 该过程归结为: 将应用程序订阅Firebase Cloud Messaging主题 创建一个在远程配置更改时触发的云功能 在AppDelegate中处理无提示推送通知 在下次启动时使远程配置缓存无效 如何设置Firebase Cloud Messaging不在本文讨论范围之内,但是文档是一个不错的起点。 1.订阅主题 推送通知启动并运行后,我们需要为该应用订阅主题。 我们将专门为远程配置目的使用一种。 2.创建云功能 Cloud Function只是一个Node.js脚本,因此您的计算机上将需要Node.js。 在撰写本文时,Cloud Functions支持Node v6或Node v8,默认为v6。 拥有Node.js后,请先安装Firebase CLI。 npm install -g firebase-tools 然后使用CLI工具进行身份验证。 Firebase登录 现在,为函数创建一个文件夹,将其cd入其中并初始化Firebase项目。 Firebase初始化功能 这将启动CLI向导。 完成它,您就可以开始了。

在Swift中使用Alamofire进行可扩展的网络

如今,几乎每个应用程序都需要从远程API获取数据或向远程API发送数据。 现代应用程序的网络层是应用程序体系结构的关键部分,因此需要以可扩展和类型安全的方式进行设计。 前不久,objc.io的家伙们提出了一个小型网络库的设计,该库能够执行iOS开发人员在应用程序开发周期中可能面临的最常见任务。 在本文中,我将重新讨论objc.io的方法,并展示该方法的典型应用。 首先,我们需要定义三种核心类型APIAction , Resource和APIClient 。 让我们从APIAction开始。 APIAction实例描述将要发送到服务器的http请求。 这是一个协议,应该被采用。 与往常一样,您可以在GitHub上找到完整的源代码。 请留下您可能有的任何评论,我们很高兴收到任何反馈。 您可以通过LinkedIn或Facebook与我联系。 alexey-savchenko /网络示例-中 通过在GitHub上创建一个帐户,为alexey-savchenko / NetworkingExample-Medium开发做出贡献。 github.co

Swift:如何将图像放置成一个圆圈

以圆圈显示图片。 Swift 4:对于iOS,这应该显示一个圆圈。 将图像的IBOutlet拖动(按住Ctrl键并单击)到您的代码中。 cornerRadius绘制图层背景的圆角时使用的半径。 可动画的。 https://developer.apple.com/documentation/quartzcore/calayer/1410818-cornerradius clipsToBounds属性一个布尔值,该值确定子视图是否限于视图的边界。 https://developer.apple.com/documentation/uikit/uiview/1622415-clipstobounds 2.在viewDidLoad()中, 使用实例属性 layer.cornerRadius 和 clipsToBounds 。 profileImage.layer.cornerRadius = 50 profileImage.clipsToBounds = true

使用Swift以编程方式布局视图的另一种方法

开始学习Swift时,我对自动布局系统感到困惑。 无论是使用情节提要还是程序限制,它都不适合我。 一些约束在运行时会干扰其他约束,而对所有不同的冲突约束进行分类变得令人沮丧。 我承认在Xcode中使用自动布局功能非常强大,但我相信,除了自动解决方案的替代方法会增加计算成本之外,还会增加其他复杂性。 请注意,在我的标题中,我并不是说这是一种布局视图的“更好”方法,只是一种可以促进进一步实验的不同方法 我觉得有一种更简洁,更省钱的布局视图方式,因此我开始着手开发一个名为View Layout的小型项目。 它只是UIView的扩展,您在其中实例化一个结构(ViewLayout),该结构为您计算视图的位置。 您可能会做的所有数学运算都可以使用CGRect和框架布局视图? 所有这些都封装在“视图布局”结构中。 它使用ViewPosition枚举来确定视图相对于“引导视图”的位置。 我不会尝试描述它,而是显示代码。 这是ViewLayout的初始化,包括分解和解释的步骤。 //您要放置的视图的不同位置选择 枚举ViewPosition { 案例底部中心 案例底部左 案例底部右 案例中心 案例顶部左 案例顶部右 案例中心 剩下的情况 案例权 } //通常除非要以根视图为指导进行布局,否则通常要使用withFrame init init(withFrame ofView:UIView,position:ViewPosition,size:CGSize,padding:(CGFloat,CGFloat)){ self.guide = ofView.frame // 1 self.position =位置// 2 self.size =大小// 3 self.padding =填充// 4 } 1:我设置ViewLayout对象在计算其原点时使用的框架 2:我将框架的位置与指南进行了比较 3:我设置要在ViewLayout中创建的框架的大小 4:我使用元组设置视图的水平和垂直填充。 第一项(padding.0)控制垂直填充,正数增加原点的Y坐标,负数减少原点的Y。第二个数与水平填充相同,正数增加X坐标,负数减少了它。 现在,调用此初始化程序后,您将获得一个ViewLayout对象! 不过您还不能使用它。 您只是获得一个自动配置的框架以供视图使用而已,而仅仅是一个函数调用! 您所要做的就是调用以下功能之一: //不要忘记在实例化结束时调用它! […]

Certifire:Apple推送通知证书生成的自动化解决方案

获得APN证书是在Apple App Store上发布应用程序的关键步骤,但是许多iOS开发人员为此付出了巨大的努力,因为它的流程过于繁琐且过于沉闷。 APN证书对从已发布的应用发送到拥有您的应用的iOS设备的推送通知进行身份验证。 而且,如果您是iOS开发人员,那么您很可能会熟悉用于应用程序发布的证书生成过程。 全世界的开发人员都在为生成SSL证书的管理任务而苦苦挣扎,而这种挣扎会导致许多麻烦,浪费资源和时间,这取决于开发人员的专业水平。 一些经验丰富的开发人员可以在一个多小时内完成该过程,而其他开发人员可能要花多达8个小时的时间,在过程中会损失大量资金。 幸运的是,已经为iOS开发人员找到了一种解决方案,现在他们可以告别在证书生成上花费的漫长的不眠之夜。 没错,随着macOS应用程序Certifire的推出,证书生成过程完全自动化。 这意味着您可以轻松快速地生成开发和发行证书。 该应用程序是软件公司和开发人员的绝对救星,其主要目标是帮助他们将宝贵的时间用于编程等更重要的任务。 除了作为证书生成的极具成本效益的解决方案之外,Certifire还允许其用户获得一个有组织的文件夹,并在一个安全的环境中管理其所有应用程序证书。 对于开发人员来说,该应用程序拥有的好处似乎无穷无尽,因此,您最好快点测试魔术! Certifire上每个证书的生成费用为每个申请19.99美元。 但是,一旦用户下载了该应用程序,他们将在其团队中获得$ 19.99的余额,从而使他们能够免费为自己的第一个应用程序生成发行和开发证书。 然后可以相应地向用户的团队ID收费,以为更多应用程序生成更多证书。 软件开发公司和iOS开发人员将不再浪费宝贵的资源和时间来手动管理此任务,因为Certifire会在一瞬间为他们完成此任务。 您可以访问http://www.certifire.io/查找有关Certifire应用程序及其功能的更多信息! Apple推送通知(APN)证书生成从未如此轻松!

使用协议和MVVM的可重用视图布局

想法💡 之所以将其命名为“可重用视图布局..”而不是简单地命名为“可重用视图..”,是因为在这里我不是指视图的对象级可重用性。 相反,我将讨论如何在protocol和MVVM的帮助下重用视图布局。 在这个过程中,我将分享我们如何使用一个protocol概述一个视图的界面, 基本不同的配置状态 ,该protocol将使我们能够将不同的view-models注入到一个视图中。 换句话说,这里的想法是设计视图布局的数据不可知模型。 MVVM 在继续之前,让我们先简单了解一下MVVM 。 这是目前最令人困惑的设计模式之一,因此只需要确保我们在同一页面上即可。 这是一种设计模式,其中,我们使视图依赖于称为视图模型的中间模型对象。 这个视图模型获取一些数据(与网络或持久层无关),并应用一些装饰方法,这些方法最终被视图消耗。 例如,如果我们有一个配置文件视图类– ProfileView ,我们可以创建它的视图模型ProfileViewModel进行配置并保存其状态。 class ProfileView: UIView { var nameLabel: UILabel! func configure(with model: ProfileViewModel) { nameLabel.text = model.nameTitle } } struct ProfileViewModel { var nameTitle: String { return “Profile Title” } } 捆绑 我们可以看到,使用MVVM时, ProfileViewModel与ProfileViewModel结合在一起ProfileViewModel进行任何类型的配置。 如果您的视图在整个生命周期中仅具有一种视图模型,则此方法效果很好。 现在,我们要重用ProfileView类,该类应该能够显示Owner配置文件和Guest配置文件。 枚举 为了支持这一点,我们可以将ProfileViewModel转换成一个所有者和来宾情况不同的枚举。 enum ProfileViewModel { […]

Swift#1:元组或元组?

问题 Entédéveloppeur,关于如何解决唐纳德的问题。 Dans le cas d’unedonnée很简单,例如在renvoie comme valeur de retour d’une fonction上。 Dans le cas d’unedonnéeComplexe,在适当的“人间结构”上。 Mais si cettedonnéen’est ni trop简单,ni trop复合物? 恩·贾瓦(En JAVA),杜瓦河沿岸(envoy de renvoyer deux)的康菲恩·德·富瓦(Trois Valeurs sans pour autantcréerun tableau)? 解决方案存在于Swift中: les tuples 。 Quéest-ceque les tuples? 永久组团的便利性的元帅,新古典主义风格的无价之宝。 瓦伦西亚和瓦卢斯的元帅同盟 斯威夫特的自由主义者丹尼斯·拉·库普里斯(Das la librairie standard de Swift),前女同性恋夫妇(clé, valeur) valeur (clé, valeur)专注于类型Dictionary上的结构和功能,而您可以根据自己的喜好来选择。 语言元组: let person =(名称:“ […]