Tag: iOS App开发

我应该使用struct还是class?

如果您不熟悉Swift,那么您可能会认为Struct和Class可以做完全相同的事情,而struct的灵活性也较低,因此为什么不使用Class而不是Class呢? 结构是值类型, 类是引用类型。 引用类型位于堆内存中,值类型位于堆栈存储器中。 因此有时struct可能比类更快,但实际上它取决于许多其他事情。 包含值类型的变量包含整个值类型值。 当您将值类型复制到另一个变量时,这意味着您正在复制整个值。 复制后,它们是两个不同的变量,如果您对一个变量进行了一些更改,则不会对另一个变量产生影响。 包含引用类型的变量包含一个指针,该指针保存实际变量所在的内存地址。 将引用类型复制到另一个变量意味着它将地址从一个变量复制到另一个。 这两个变量现在拥有相同的内存地址。 如果对其中一个进行一些更改,则对另一个也会有相同的效果。 如果我们通过Struct和Class,那么我们可以得出如下摘要: 课程– 可以支持继承。 正在配套铸件。 可以有反初始化器。 支持引用计数。 结构- 不支持继承。 不支持类型转换。 通过价值传递。 不能有空引用。 因此,结构基本上适合用作数据容器,而不是逻辑部分。 如果您的数据类型相对较小且寿命较短,则可以考虑使用结构。

没有痛苦就没有收获:Lambda学校的痛苦越来越大

对于每一项新业务,随着业务的发展,必然会有障碍。 在我在Lambda学校的第二个月中,很明显,这个为期30周的编程训练营吸引人的部分原因是他们每天都在挑战高等教育的现状。 我个人可以认同这种意识形态。 作为一家初创企业,Lambda可以比大多数传统教育机构更快地迭代和更改其课程。 如果某件事不起作用,或者企业正在寻找潜在员工的特定技能,则Lambda可以迅速调整课程设置,并为他们的学生为将来的就业做好更好的准备。 在行业中,随行业需求变化的能力是非常宝贵的,而这一行业的变化速度要比手机更新快。 Lambda不仅是一个整体的创业公司,而且我的学生足迹本身就是一个创业公司。 我属于iOS的第五条曲目,这意味着我属于Lambda的iOS课程的第五次迭代。 有时,我的学习经历会实时处理打ic,因此会感觉有些不合常规。 上周,我选择利用Lambda的异步调度功能,并决定重复本周的课程,因为我对这一概念没有信心。 我想成为一名独立开发人员,所以精通每个概念是我的主要目标。 在与我的项目经理(Lambda的教学助手版本)讨论了我的决定后,我被告知我无法参加现场课程,而不得不观看预先录制的课程。 听到这消息令人很沮丧-感觉接下来的20周我将要通过YouTube学习。 现场授课对我来说更有价值,因为它可以让学生实时向讲师提问。 但是第二天,我们的异步班级收到通知,我们将继续使用实时班级,而不是预先录制的班级。 他们的课程有多么大的改变! 一所了解学生是他们最有价值的产品的学校使我感到我们被倾听并受到尊重。 变革很难,但是在一个开放的拥抱中拥抱变化的环境使我相信,我将能够为一家公司工作或管理自己的公司,并且能够渡过瞬息万变的行业不断增长的痛苦。

简化iOS软件设计的四个规则

在1990年代后期,在开发极限编程时,著名的软件开发商Kent Beck提出了简单软件设计的规则列表。 根据肯特·贝克(Kent Beck)的观点,优秀的软件设计: 运行所有测试 不含重复 表达程序员的意图 减少类和方法的数量 在本文中,我们将通过提供实用的iOS示例并讨论如何从中受益,来讨论如何将这些规则应用于iOS开发领域。 运行所有测试 软件设计可以帮助我们创建一个按预期运行的系统。 但是,我们如何验证系统最初将按照其设计预期运行? 答案是通过创建验证它的测试。 不幸的是,在iOS开发中,大多数时候都避免进行Universe测试……但是,为了创建设计良好的软件,我们在编写Swift代码时应始终牢记可测试性。 让我们讨论两个可以简化测试编写和系统设计的原理。 它们是单一责任原则和依赖注入。 单一责任原则(SRP) SRP指出,一门课程应该只有一个,只有一个改变的理由。 SRP是最简单的原理之一,也是最难解决的原理之一。 责任分担是我们自然而然的事情。 让我们提供一些很难测试的代码示例,然后使用SRP对其进行重构。 然后讨论如何使代码可测试。 假设我们当前需要从当前视图控制器中显示一个PaymentViewController , PaymentViewController应该根据我们的付款产品价格来配置其视图。 在我们的案例中,价格是可变的,具体取决于某些外部用户事件。 当前,此实现的代码如下所示: 我们如何测试此代码? 我们首先应该测试什么? 价格折扣是否正确计算? 我们如何模拟付款事件以测试折扣? 为此类编写测试会很复杂,我们应该找到一种更好的编写方法。 好吧,首先让我们解决这个大问题。 我们需要解开依赖关系。 我们看到我们有逻辑来加载产品。 我们有付款活动,使用户有资格享受折扣。 我们确实有折扣,折扣计算,然后再继续。 因此,让我们尝试将它们简单地转换为Swift代码。 我们创建了一个PaymentManager来管理与付款相关的逻辑,并创建一个单独的PriceCalculator ,它易于测试。 另外,数据加载器负责网络或数据库的交互,以加载我们的产品。 我们还提到,我们需要一个负责管理折扣的课程。 我们将其CouponManager并管理用户折扣优惠券。 然后,我们的“付款”视图控制器可能如下所示: 我们现在可以编写如下测试 testCalculatingFinalPriceWithoutCoupon testCalculatingFinalPriceWithCoupon testCouponExists 还有很多其他的! 通过现在创建单独的对象,我们避免了不必要的重复,并且还创建了易于编写测试的代码。 依赖注入 第二个原则是依赖注入。 从上面的示例中我们已经看到,我们已经在对象初始化程序上使用了依赖注入。 像上面那样注入我们的依赖项有两个主要好处。 它清楚说明了我们的类型所依赖的依赖关系,并允许我们在要测试时插入模拟对象,而不是真实的对象。 […]

使用泛型和描述符在iOS上标准化图标,图像和占位符

创建良好的用户体验时,一致性是关键。 在显示图标,产品照片,占位符或加载微调框时,只需一个位置来定义它们的外观以及应如何在屏幕上显示这些内容,就可以使我们保持一致。 在iOS的世界中,我们使用UIImageView ,它允许我们显示图像并配置诸如contentMode , tintColor , backgroundColor类的东西,让我们不要忘记那些非常重要的UI测试的accessibilityIdentifier 。 我们正在努力做到两件事: 一个可以定义我们如何在应用程序中显示标准图标和图像的地方,包括应应用于每个图标和图像的图像视图设置。 一个干净的呼叫站点,可以应用这些图像,而不必担心如何以及何时加载和显示这些图像。 以下是一些我们要标准化的常见图像类型的示例: 加载微调器 :本地图像,无缩放比例的集中化图像,浅灰色背景,“ loadingImage”可访问性标识符。 下载的产品图片 :从URL下载,缩放以填充“ productImage”可访问性标识符。 占位符图像 :本地图像,没有缩放比例的集中化图像,灰色色调,浅灰色背景,“ placeholderImage”可访问性标识符。 下载失败图标 :本地图像,没有缩放比例的集中化图像,红色色调,浅红色背景,“ failureImage”可访问性标识符。 功能图标 :本地图像,无缩放比例集中显示,深灰色色调,浅灰色背景,“ featureX”可访问性标识符。 一些图像/网络库允许您在加载远程图像时提供占位符,但是我们需要比通常提供的更多控制权,以允许我们准确指定它们的显示方式。 当显示特定屏幕的图像时,我们不想担心图像的下载方式和时间。 我们只想对图像视图说:“显示此图标”,或“使用我们的标准占位符加载此图像”。 我们希望我们的呼叫站点尽可能简单。

iOS App生命周期

嗨,ọ! :))“Đãtừrấtlâurồi”mớingồiviết博客lạithếnày。 Baonhiêunănglượng,nhiệthuyếtlúcmớibắtđầubayđiđâumất,chỉạlạilườibiếng。 Hômnay,mìnhquyếttâm类型nhữngdòngnàycũnglàdocómộtsựkiện启发了mìnhcựckì。 Chuyệnlànayđiuốngbiatándócvớiđámbạn,ngồimộthồithììáquachủđềtech,rồimộthồinữalạitớivụapp life cycle iOS,mìnhhớnằằn cn cho :nhmìnhđúng:3Tấtnhiênlàvậy​​,vìđơnthuầnthìbọnlàmtechkhábảothủ(cãitrướcrồitínhtiếpvêv:v),kiểugìcũngcholàmình。 Màkiểuvừacãimàvừangờngợkbiếtmìnhcónhầmkhông。 请记下lạimộtlầncholầnsaunhảyvôcoi。 VângchủđềhômnaymìnhsẽnóiđếnlàiOS 应用程序生命周期 。 Tr iOSchếtnhìnchung trongcáchiOSquảnlýapp(c(thểlàcácappsđangchạy),mộtappsẽcóvàitrạngtháinhưsau: 未运行 :此应用程序已终止,已终止(用户可以强制系统运行)。 活动 :l app app angchạy,cànghĩalàđangtrên前景色,appvẫnnhậnvàxửlý事件bìnhthường。 不活动 :应用程序前台,nhưnglúcnày应用程序khôngxểlý事件(cóthểlàbịchen ngangbởimộttácvàokhác)。 Hoừcđâycũnglàmộttrạngtháikhi应用程式运输前景xuống背景。 背景 :应用程序运行于后台,任务运行在OS上。 暂停 :应用程序ở背景nhưngkhôngthểthựcthi cc cc任务。 通过ườapp app app app app app app system system system app app app app app app.。 Lúcnàythìappvẫncòntrong记忆。 1ikháithìtrong 1生命周期củaappchỉcónhữngtrạngtháinhưtrên。 […]

实施夜间模式

为了获得最佳风味,此帖子最好在 Late Night Swift上找到 。 欢迎发布《深夜雨燕》的第一条! 与开始构建“夜间模式”相比,这比启动一个功能要好得多,因为越来越多的人在晚上使用他们的设备,这是一项非常重要的功能。 我们的目标是使将主题应用于UI组件并使主题之间的过渡动​​画化变得非常简单。 为了实现这一目标,我们将构建一个名为Themed的协议,任何符合该协议的内容都将参与主题化。 扩展名MyView:主题{ func applyTheme(_主题:AppTheme){ backgroundColor = theme.backgroundColor titleLabel.textColor = theme.textColor subtitleLabel.textColor = theme.textColor } } 扩展AppTabBarController:主题{ func applyTheme(_主题:AppTheme){ tabBar.barTintColor = theme.barBackgroundColor tabBar.tintColor = theme.barForegroundColor } } 如果您只是想潜入,这是示例代码的链接! github.com/latenightswift/night-mode 对行为的思考使我们概述了一些初始要求: 用于存储和更改当前主题的中心位置。 一个主题类型,将主要由标记的颜色定义组成。 当前主题更改时通知我们应用程序感兴趣部分的机制。 任何事物都能以干净,迅速的方式参与主题的能力。 要更改应用程序的状态栏,选项卡栏和导航栏以及自定义视图和视图控制器。 要使用漂亮的交叉溶解动画执行主题更改。 也没有理由为什么支持夜间模式的应用程序不支持许多其他主题。 考虑到这些想法,让我们进入并为主要演员建模。 主题协议的定义 让我们首先定义当我们说需要在某个地方存储当前主题并允许我们在主题更改时订阅通知时的含义。 ///描述一种类型,该类型具有当前的“主题”并允许 ///更改主题时要通知的对象。 协议ThemeProvider { ///应用实际使用的主题类型的占位符 关联主题 ///当前活动的主题 var […]

操作员trong swift iOS

快速操作员swiftcócácloạinhư: 一元 :cáctoántửdùngcho 1đốitượng 一个= ! b //前缀 a = b为! c //后缀 二进制 :cáctoántửdùngcho 2đốitượng a = b * c //中缀 三元 :cáctoántửdùngcho 3đốitượng,vàchỉcó1làdùngchotrườnghợpkiểmtrađiềukiệnthaythế a> 0? : 操作员超载 struct Vector2D :ExpressibleByArrayLiteral { var x = 0.0,y = 0.0 init(x:Double,y:Double){ self.x = x self.y = y } init(arrayLiteral:Double …){ self.x = arrayLiteral [0] self.y = […]

如何在iOS应用中添加自定义字体-使用Swift进行编程

今天,我将向您展示如何向iOS应用添加自定义字体。 我要做的第一件事是创建一个新组。 完成此操作后,右键单击并选择“添加文件”: 导航到自定义字体的字体文件并添加它们,确保已复制项目并将其添加到正确的目标,默认情况下一切对我而言都是正确的: 如果添加了字体组,它应该看起来像这样: 接下来,您需要打开info.plist并添加一个新的属性,称为application所提供的fonts 。 添加该键后,在项目0旁边添加字体名称。 如果您的字体有更多样式,如粗体,斜体,浅色等,则您需要添加更多项,每种样式都需要添加一个。 添加字体后,您所需要做的就是在代码中使用它。 这就是我使用它的方式:

持续学习曲线(2018年6月)

6月7日,星期四 在生产中使用服务器端Swift的经验教训 完善 完美记录 Kitura 汽 泽沃 让我们加密 数字海洋部署 风暴 Web套接字 完美的TensorFlow 技术交流 熟练技工 斯威夫特ORM 完美HTTP服务器 然后 迅捷时刻 MySQL文档 状态码定义 SoundCloud的工程水平 iOS因素 iOS因素— Git 质地 为什么我使用Texture构建我的应用程序 类套件 OneSignal 核心数据编辑器 6月8日星期五 VueFlux QuickTableViewController WWDC 2018平台国情咨文回顾 升级:为什么开发人员需要能够持久识别技术(以及如何实现) 微软为何收购GitHub 让我们为Xcode开发人员优化与终端的合作 如何在新职业中或在职业生涯中的任何时候逃脱炼狱的教程 Swift 4.2的新功能 什么是新的 WWDC 2018链接 MySQL 5.7参考手册 为什么高级开发人员会编写哑巴代码,以及如何在千里之外找到少年 6月11日星期一 Apple开发人员文档 证书固定 无所作为的力量 迅捷 WWDC 2018 6月13日,星期三 在Swift中分享激情 […]

如何在iOS应用程序中集成Stripe Payment网关

您将如何构建一个接受付款的移动应用程序? 无论是旅行应用还是电子商务,您都需要找到一些方法来接受客户需要购买的产品的电子付款。 拥有一个可以轻松在您的移动应用程序内部运行的支付网关的基本知识。 它提供了一个平台来完成客户和供应商之间的交易。 这类付款方式可能同样会影响访问者对您品牌的看法,并成为他们是否进行购买的主要原因。 因此,拥有支付网关是不够的,但它应该是安全且高度可靠的。 有多种付款网关,使您能够通过其API处理信用卡交易的信息。 在流行的金融交易生态系统中,Stripe是众所周知的支付网关之一。 Stripe是由Collison兄弟于2011年推出的一种易于使用的在线信用卡处理解决方案,是一种对开发人员友好的支付系统,其设计采用了一系列合并的API和工具,可迅速使企业接受和管理在线支付。 安装库 使用CocoaPods安装库,该库是Objective-C项目的依赖管理器。 配置API 使用可发布的API密钥配置Stripe。 理想的情况是安排Appdelegate的方法,目标是在应用程序的整个生命周期内对其进行设置。 添加接受用户信用卡信息的Stripe Control 要进行交易,您的应用程序应收集客户的信息,例如持卡人姓名,帐号,CVV号等。 在Stripe付款网关中,建议通过Apple Pay收集用户存储的付款信息。 为了利用Apple Pay,您必须在Xcode的应用程序中包括“ Apple Pay”功能。 这需要在Apple上设置商家ID,一旦设置,您就必须生成PKPaymentRequest才能提交到Apple服务器。 您必须将paymentSummaryItems属性设置为P KPaymentSummaryItems数组。 发出请求后,检查设备以确保Apple Pay是否可访问。 然后,您应该创建并显示付款请求viewcontroller 。 您可能已经看到ViewController是PKPaymentAuthorizationViewControllerDelegate 。 您将通过使用此协议来处理付款批准控制器返回的PKPayment 。 添加代码以生成令牌 收到PKPayment之后 ,可以使用基本方法调用将其转换为一次性使用的Stripe令牌。 将令牌发送到您的服务器 您为createToken提供的块将在Stripe带令牌返回的任何点被调用。 您必须将令牌发送到服务器。 这是您从服务器端代码向卡收取费用并将成功或失败信息返回给应用程序的最后一步。 这样就可以有效地从客户的信用卡中扣除他们在应用程序中进行的购买的费用! 基本上,Stripe考虑到市场需求为您提供信用卡服务。 通过高度安全的支付网关集成,您可以轻松地从客户那里获得即时付款,该集成将您的移动应用程序转变为POS终端。 您可以在几分钟内启动并运行所有内容,而不必浪费时间来设置商家帐户和使用令人困惑的客户付款网关。