Swift中的原型设计模式

通过复制现有对象的所有属性并创建独立的克隆,原型模式用于实例化新对象。 当新对象的构造效率低下时,此做法特别有用。 想象一下,下面有一个SmartPhone类: 现在我们需要创建此类的5个实例,如下所示: 我们可以很容易地意识到许多实例具有相同的属性,因此我们经常复制代码行,然后以不同的方式编辑任何属性。 没关系,但不是经过优化且容易出错。 让我们尝试将Prototype模式应用到下面的SmartPhone类中: 我们声明一个带有默认可选参数的克隆 func与属性相同。 该函数通过复制现有实例的所有属性返回一个新实例,然后根据需要修改某些属性。 现在创建5个实例作为波纹管: 我们不再需要通过调用设计的初始化程序来初始化新实例,只需“克隆”当前实例然后对其进行修改! 就这样! 原型模式非常易于理解,也易于通过其他编程语言实现。 当新对象的构造效率低下时,此功能特别有用。 如果您有任何疑问,请留下您的赞赏,感谢您的阅读!

iPad App开发:为什么印度是Wagon Master?

通过Daffodil Software 一项研究表明,到2018年,美国的iPad用户数量预计将达到809亿 。 如此高的数字生动地证明了最近对iPad应用程序开发的呼声越来越高。 苹果应用商店拥有超过一百万个用于平板设备的本地应用。 这肯定是由于企业通过移动设备(以及智能手机和可穿戴设备)接触潜在客户和用户的事实不遗余力。 这些细节使我们很接近iPad应用程序开发外包为何成为当前趋势主题的原因。 在这种情况下,越来越受到关注的是印度成为开发iPad应用程序的首选。 在后面的部分中,我们将找出在苹果iPad应用程序开发方面使企业对印度保持兴趣的理由。 1.印度是技术熟练的海洋 “ 如果我们停止从印度雇用工程师,那么印度将再有一个微软 。”微软联合创始人比尔·盖茨认为。 作为美国科技偶像,IBM雇用的印第安人多于美国人 。 一项研究表明, 美国宇航局的科学家中有 3 6%是印第安人 。 这些事实支持印度人在IT和工程领域的信誉。 凭借绝对的编程技能和逻辑思维,将iPad应用程序开发外包到印度绝对是任何企业的最佳选择。 2.印度的开发者社区庞大 仅次于美国,印度拥有最大的开发商社区。 据信,到2018年,这一数字将达到400万,这将使印度超过美国。 考虑到这一点,苹果公司已经分享了在印度班加罗尔开设新的iOS应用程序设计和开发加速器的计划。 目的是为本地iOS开发人员提供专业支持。 该开发人员社区包括公司雇用的人员和自由职业者。 因此,在印度寻找iPad应用开发公司不再是一项艰巨的任务。 3.印度比美国便宜10倍 这是印度成为外包IT服务的首选的最明显原因之一。 平均而言,如果一个应用需要花7到8周的时间进行开发,则其成本大约为48,000美元,比印度的价格高10倍。 定价模式的巨大差异驱使世界各地的企业和个人雇用印度开发商。 就iPad应用程序的开发成本而言,印度提供了最有效的开发模型,因此,印度被认为是雇用相同程序员的最主要选择。 4.印度的政府政策是灵活的 外包一直是印度政府的主要收入来源,因此它允许100%的外国直接投资(FDI)。 根据2000年IT法案,印度IT入伍,这是该国最大的投资领域。 考虑到这一点,印度可以算是外包IT服务(包括iPad应用程序开发)的最佳场所。 5.改变时区是一个优势 印度时区与其他国家的时区差异很大。 因此,就有机会在预期时间或之前完成并交付项目。 例如:在白天,在美国一天结束前发送给印度的项目需求已完成。 因此,这可以提高生产率,定期报告项目状态,并有时间专注于更相关的任务。 另请阅读: 外包IT服务:一家公司与Freelancer 由于可用选项太多,因此很难在印度列出iPad应用程序开发合作伙伴的难度。 您可以选择知名的应用程序开发公司(例如Daffodil),也可以访问汇总网站(例如Clutch,Good Firms等)做出明智的决定。 最初发布在 appdevelopment.daffodilsw.com上 。

挥舞着2019年:值得关注的iOS应用开发趋势!

iOS永远领先一切。 推出来年的功能或发布一些新闻。 当然,与技术相关的人员和公司绝不应落后于趋势。 来到2019年的iOS趋势中,它有很多事情要做。 问候现代iOS开发人员和软件工程师之后,苹果公司已经在iPhone和iPad中带来了市场上的最新趋势。 虽然软件开发公司已经在尽最大努力从其应用程序开发过程中获益,但我们还是需要一些服务。 如果您是有才华的iOS开发人员之一,并且希望跟上即将到来的移动应用程序趋势,请在此处注意以下几点: 智能家居,智能世界 我们都听说过物联网和机器学习方面的知识,我们非常喜欢将这些应用程序引入标签和手机中。 但是,如果iOS今年本身就将事情摆在桌面上呢? 印度著名的iOS应用开发人员已开始设计用于多用途家庭用途的特定iOS应用。 此外,苹果用户对家用套件非常熟悉,他们不会阻止他们充分利用它。 Siri的语音命令-有关AI的全部内容 苹果在人工智能和机器学习领域几乎占据了主导地位。 出于同样的考虑,Siri已经开始以出色的抓地力和集成的惊人Siri快捷方式来处理不同的语音命令。 这也引起了iOT设备的关注。 苹果已经为iOS开发人员推出了Sirikit,它可以与人声命令无缝协作。 因此,现在Apple用户可以自由使用他们的手机,而无需解锁手机。 借助启用了Sirikit的人工智能的这些巨大好处,Apple用户都很好地欢迎2019年iOS趋势。 此外,快速编程语言的使用增加了 多笔交易 Apple知道随时随地进行快速交易的必要性。 在技​​术时代,世界太小了,而且相互联系,在这种时代中,更好地考虑轻松交易是可以接受的方法。 随着我们越来越接近电子钱包将成为主流的世界,越来越多的企业正在寻找最好的应用程序来协助 仅苹果一家公司就见证了上一年的10亿笔交易,苹果公司的薪酬已经证明了其重要性。 在用户可行性方面,Apple一直处在前一个阶段,而在2019年,Apple具有更高的水平。 ML2工具包 机器学习和人工智能是这个时代蓬勃发展的技术术语。 ML 2工具箱在开发移动应用程序中起着至关重要的作用。 2019年将见证Core ML 2的超强发布,并将增强顶级移动应用程序开发公司的实力。 更快,更安全,更强大。 全新的核心ML 2是通过一流的改进来美化iOS功能及其完整性的工具。 增强安全性 对于iOS应用程序开发,苹果已将应用程序传输安全性强制性化。 Apple的应用程序传输安全性定义了iOS移动应用程序中新的安全级别。 作为iOS应用程序的传统,兼容性和安全性每年都得到前所未有的更新和扩展。

哪种类型的家庭分机最适合您的家庭?

住宅扩展始终是为您的位置创建额外空间的绝佳选择。 扩展您的办公室空间或您的房屋都没有关系。 您可以选择扩展大频谱或小频谱。 该扩展为您的家提供了额外的空间,让您可以根据自己的生活方式生活。 拥有有关其类型的信息对于确定最适合您的房屋的想法至关重要。 为了扩展,您必须弄清楚空间和成本等所有方面。 在此博客中,您将了解最适合您的不同家庭分机类型 侧面延伸 侧面扩展是车道到您本侧的扩展。 它不像其他扩展那样著名,但是它用于特定的区别。 这是您家附近的户外厨房餐厅和休息室的最佳选择。 后延伸 在该属性的背面必须延伸的地方,这种延伸是优选的。 通常,我们必须扩大我们的厨房和用餐区,以便这种进步会有所帮助。 每当您想扩大厨房或休息室的位置时,都可以在自己的位置加一个后部扩展件。 扩展包装 这是后部和侧面扩展件的组合,可创建一个更大的空间,尤其是用于用餐区,客人休息室和其他任何地方。 我在利兹见过这种类型的房屋扩展 ,人们在露天用餐区大量使用环绕扩展。 双层扩展 当单层必须扩展到两倍时,可以使用这种扩展。 人们选择这些来满足他们家的要求。 当您看到公司从几名员工成长为数百名员工时,这对于办公空间也是有益的。 如果住所遇到住宿困难并且无法按照生活方式生活,则他们倾向于双层扩展。 双层扩展比其他方法花费更多。 这些是您可以在家中或任何其他地方使用的扩展名的主要类型。 不要自己尝试DIY技术,因为您可能不得不面对其他问题,例如获得邻居或土地管理局的规划许可。 在计划得到专业人士的帮助之前,他们将让您知道该怎么做以及哪种类型最适合您的位置。 为建筑和规划提供经济有效的解决方案的不同专业人士。 如此有用; 专业建议,以保护您的网站免遭破坏

Swift和iOS良好做法#12中代码质量和简洁性的提示

导入SomeExternalFramework FooViewController类:UIViewController,FoobarDelegate { let foo:富 private let fooStringConstant =“ FooConstant” 私人让floatConstant = 1234.5 // MARK:生命周期 //自定义初始化程序转到此处 // MARK:查看生命周期 覆盖func viewDidLoad(){ super.viewDidLoad() // … } // MARK:布局 私人函数makeViewConstraints(){ // … } // MARK:用户互动 func foobarButtonTapped(){ // … } //标记:FoobarDelegate func foobar(foobar:Foobar,didSomethingWithFoo foo:Foo){ // … } // MARK:其他助手 私人功能displayNameForFoo(foo:Foo){ // … } } 如果您不打算对一个类进行子类化,请将其定为final 。 对tableview进行两个扩展 (一个用于数据源,另一个用于委托方法)。 […]

iOS Huddle#4

2016年12月29日星期四 iOS Huddle是我们每月在Black Pixel iOS团队的Slack频道中共享的最佳链接的摘要。 反应式编程 如今,反应性编程似乎风行一时。 如果您对反应式编程感到好奇,我们认为Cocoa with Love的这篇文章很好地介绍了其背后的一些概念。 Matt Gallagher通过以下原则定义了反应式编程: 可变状态的任何“获取器”都会引起问题。 代替使用getter,任何计算,生成,加载或接收的状态值都应立即发送到通道中,并且想要访问这些值的程序的任何部分都必须订阅该通道。 本文就一些简单用例的KVO有多高提出了一些很好的观点,并概述了我们在使用它时遇到的一些典型问题。 与往常一样,反应式编程可能不是万灵药,但它提供了一种不同的方式来了解如何设计应用程序。 的GitHub GitHub现在允许您直接从PR中解决合并冲突。 对于最简单的问题,这是一个实时保护程序。 对于更复杂的问题,万花筒仍然是我们的最爱。 元编程 DRY是一个好概念,通常不那么容易实现。 有些人认为过早地进行DRYing类似于过早的优化。 其他人发誓。 无论您对DRY感觉如何,我们可能都同意的一件事是,样板代码的实现可能是乏味,重复且容易出错的。 我在看您,JSON序列化和NSCoding! 因此,为什么不使用一些不错的元编程和自动代码生成来替换其中的部分或全部。 这就是Sourcery可以为您做的。 您可以查看该崩溃报告吗? 我们中有多少人被问到这个问题并交出了未标记的堆栈跟踪信息? 没什么好玩的。 幸运的是,Apple写了一篇非常不错的技术说明,标题为“了解和分析应用程序崩溃报告”。 快速游乐场 Swift Playgrounds确实可以帮助您快速制作原型并测试想法。 操场也可以用来隔离一些特定的问题。 PlayAlways可让您直接从菜单栏中快速创建Xcode游乐场。 幕后花絮 当Instagram展示其如何重新设计其Feed时,深入介绍实现细节时,您知道您可能会学到一些东西。 Instagram软件工程师Ryan Nystrom的这次演讲并不令人失望。 对于任何好奇或渴望完善自己的工艺的人来说,这都是必看的。 尝试? 与As? 这是Erica Sadun撰写的简短文章,概述了如何混合尝试? 与作为? 和条件绑定可能会带来意想不到的后果。 我的记忆在哪里? 如果像我们一样,您是Mike Ash深入技术博客的狂热读者,您将对他的GOTO 2016会议演讲感到高兴:对Swift内存布局的探索。 请放大此文本 iOS 7为iOS应用程序引入了全新的视觉设计范例。 […]

为iPhone X调整Apps UI时如何解决最常见的界面问题

在不到1个月的时间内,iPhone X就会投放市场。 全球的苹果迷迫不及待地想要购买这款外观精美的智能手机。 作为开发人员,调整您的应用程序以支持iPhone X边缘到边缘屏幕是一项不容忽视的任务。 在本文中,我将向您展示在iPhone X上运行现有应用程序时可能会遇到的一些常见UI问题,以及如何仅使用界面生成器进行一些简单的调整即可解决该问题。 请注意,我们将要讨论的问题通常在尝试在Xcode 9上运行Xcode 8或更低版本的项目时发生。但是,在使用Xcode 9创建新应用程序时,每种解决方案背后的概念仍然非常有用。让我们开始吧! 上图显示了当我们尝试在新的iPhone X上运行我们的应用程序时一个非常常见的UI问题。现在,让我们关注Label-A 。 问题的原因是因为我们假设状态栏的高度并在Label-A.Top和它的Superview.Top之间设置了垂直空间约束。 由于iPhone X的状态栏高度与所有以前的iPhone不同,因此这会导致Label-A错位到状态栏下方。 要解决此问题,我们将需要使用Xcode 9界面构建器中引入的“ 安全区域布局指南 ”。 ( 您可以 参考 Apple的 本 指南 以了解有关安全区域的更多信息 )。 首先,启用“安全区域布局指南”。 接下来,我们需要通过在Label-A.Top和Safe Area.Top之间建立关系来更新Label-A的top约束。 而已! 现在,当您尝试在iPhone X模拟器上运行该应用程序时,您将能够看到Label-A神奇地将其自身定位在正确的位置。 您基本上可以应用相同的概念来固定Label-B的位置。 只需通过在Label-B.Bottom和Safe Area.Bottom之间建立关系来更新Label-B的底部约束。 这是更改后的最终产品,这要归功于“安全区域布局指南”,您可以在iPhone 8和iPhone X屏幕尺寸上正确看到Label-A和Label-B布局。 💪 通过遵循Apple提供的指南,背景图像和UITableView(或UIScrollView)都应始终延伸到边缘并填满整个iPhone X屏幕。 上面的UI问题的原因与我们在“ 问题1 ”中讨论的原因完全相反。 以背景图片为例,屏幕顶部的间隙是由我们在ImageView.Top和Top Layout Guide.Bottom之间设置的约束导致的。 为了使图像视图占据整个屏幕,我们需要在图像视图与其超级视图之间具有顶部和底部约束。 因此,我们需要做的是将Top Layout Guide.Bottom更改为Superview.Top并将Bottom Layout […]

在Swift-4中玩闭包(Part -2)

大家好 !! 在上一篇文章中,我们都讨论了Swift中的一些基本闭包。如果您尚未对其进行检查,请进行检查。在本教程中,我们将讨论更多内容。 Swift会自动为内联闭包提供简写参数名称,可用于通过名称$ 0,$ 1,$ 2等来引用闭包参数的值。 速记参数名称 正如我们上面讨论的,Swift 4通过表示$ 0,$ 1,$ 2-$ n来方便用户将内联闭包表示为速记参数名。通过在闭包表达式中使用此速记参数名,我们可以从其定义中省略闭包的参数列表。 in 关键字 由于闭包表达式完全由其主体组成,因此可以省略。请看以下示例。 因此,在第一个示例中创建了一个闭包,该闭包采用单个参数并返回字符串。此处$ 0表示第一个参数。类似地,在第二个示例中,闭包采用两个参数,通过使用$ 1,我们引用了第二个参数。关闭 自动关闭 我们知道闭包可以用作函数中的参数。当我们编写@autoclosure时 ,参数会自动包裹在闭包中。但是,如果我们创建一个具有@autoclosure的函数,则存在一个问题,通常调用该函数具有自动关闭功能的函数,但是实现这种功能并不常见。 让我们举一个小例子。 func simpleFunctionwithoutAutoclosure(_ parameters:()-> Void){ 打印(“嘿,我们刚刚创建了一个没有@autoclosure属性的函数”) 参数() } simpleFunctionwithoutAutoclosure({ 打印(“ hello”) }) func simpleFunctionwithAutoclosure(_参数:@autoclosure()->无效){ 打印(“嘿,我们刚刚创建了一个具有@autoclosure属性的函数”) 参数() } simpleFunctionwithAutoclosure(print(“ hii”)) 并且输出如下 从上面的两个函数中,我们注意到,在@autoclosure的情况下,无需将表达式用大括号括起来。 如果要传递闭包而不是自动闭包,这就是我们需要做的。 逃逸关闭 当闭包作为函数的参数传递给闭包时,闭包被认为是对函数的转义,但是在函数返回后会被调用。 声明将闭包作为其参数之一的函数时,可以在参数的类型之前编写@escaping,以指示允许对闭包进行转义。 Apple的文档给出了一个示例,该示例将传递给函数的闭包附加到您的类/结构中可变的闭包数组中: varcompleteHandlers:[()->无效] = [] func someFunctionWithEscapingClosure(completionHandler:@escaping()-> Void){ […]

Swift:forIn和forEach循环!

Swift提供了各种类型的循环进行迭代。 即使对于正在学习编程语言的新开发人员,也很容易理解和使用。 在这里,我想描述两种类型的for循环 ,乍一看似乎很令人困惑。 它们的工作方式相似,但是两者之间存在一些基本差异。 我在WordCount对象的函数中都尝试过。 下面是操场的快照。 如果您在操场上方看到直升机视图,则表明这两个for循环之间完全没有区别,以访问或循环访问数组的元素。 这是使用forIn和forEach的两个区别! 1)您不能使用break或Continue语句退出当前的闭包调用或跳过forEach循环中的后续调用,但可以在forIn循环中执行此操作。 2)在ForEach循环中使用return语句仅针对闭包中的当前调用退出,不会跳过后续调用,但ForIn循环也退出所有后续后续调用。 和上面的操场一样, forEach跳过了单词“ two”的打印语句的执行,这意味着它不会超出printByForEach函数。 而forIn跳过了所有随后的print语句的执行,这意味着它不在printByForIn函数中。 快乐编码,继续!!!

设置一个Xcode项目以开发可共享通用代码的Cocoa和Cocoa Touch框架,并为MacOS和iOS应用程序提供可重用和可重新分发的UI和非UI组件

缺少这样的教程,或者至少当我第一次尝试执行标题(尽可能长,但尽可能短)时,自己还没有找到。 我来到了来自C#编程的Apple开发生态系统,只是试图通过新的(很有希望的)macOS和iOS目标扩展我公司已经为Windows和Web开发提供的产品集(主要是组件库)。 由于我必须通过尝试和重试来学习所有内容,而且这并不容易(至少不应该像恕我直言,这本来应该如此简单),所以我认为写下已建立的步骤并没有什么害处(随后一些屏幕截图),也许他们也可以帮助其他人-谁知道? – 在将来。 因此,让我们开始吧。 一个项目,多个目标,没有显式工作区 我了解到的第一件事是(与.NET世界中Visual Studio解决方案通常将更多项目分组的情况不同),我不需要Xcode工作区来对多个项目进行分组。 仅仅是因为我不需要多个项目。 因为单个Xcode项目可以定义多个目标,所以每个目标都有其自己的类型和目标,并且每个目标都具有针对特定平台(例如macOS或iOS)构建的二进制文件。 (但是,顺便说一下,无论何时创建项目,无论如何都会为其创建内部工作区。) 在我的研究期间,我也没有发现对通用的跨平台层的真正技术需求(尽管我曾经习惯于在.NET中开发共享的跨平台类库。)仅仅是因为Xcode中的每个源代码文件项目可以是其一个或多个目标的一部分,而无需任何源代码重复,并且目标可以根据需要完全自定义。 因此,让我们在Xcode中创建我们的第一个项目。 我们可能会尝试从一个更具体的项目类型开始,但是我发现如果首先选择一个Empty模板(从“跨平台”选项卡下;为什么从那里选择)最简单,那是因为我们肯定会为多个平台)。 因为目标(和生成的产品)必须具有唯一的名称,所以我不得不将其中一个作为主要(我选择了macOS),将另一个作为iOS(辅助)。 对于后者的名字,我刚刚附加了“ Touch”来区分它(这个想法来自您可能已经猜到的苹果公司Cocoa和Cocoa Touch框架的名字。) 分组源代码文件 下一个挑战是找到一种在项目中考虑或不考虑其指定目标的好方法,将源代码文件分组。 我最终选择使用简单分组,并为每组源代码文件生成一个文件夹。 (Xcode确实支持不带文件夹的项目内分组,某种程度上类似于Visual Studio解决方案文件夹,但至少在我开始使用的版本9中,此功能存在一个丑陋的错误-拖动非文件夹分组的项目有时会崩溃。 ) 最终,考虑到它包含的源代码的功能区域,以及一个组包含的代码对于我的项目目标(macOS和iOS)是公共的还是特定于一个的,我决定进行多级分组。 请注意,默认情况下,为每个目标Xcode创建了一个组(和一个文件夹),我还希望将该分隔保留为我的主层次结构分组。 但是,这再次要求一个目标(我选择了macOS)成为主文件夹,并同时包含特定的和通用的源代码文件,而另一个目标(iOS目标)获得了仅保留特定源代码文件的辅助文件夹。 如果您想将其复制粘贴到您的Xcode中,这是实际的源代码: 不过,我在使用示例应用程序时发现的一个重要方面是,我们不应该尝试通过将它们移动到项目结构下的公共文件夹(在那里成为子文件夹)来对应用程序进行分组,因为它似乎有些Xcode应用程序设置不要在此过程中进行更新,并且会在构建时生成特定的警告。 但是,最终我能做的是解决这个问题,即创建一个不带名为“ Samples”的文件夹的组,然后将所有示例应用程序文件夹拖到该文件夹​​中,并将它们全部放在项目结构中的单个可折叠树节点下。 (重要的是文件路径保持不变。) 部署产品 对于每个目标,Xcode都会生成一个框架文件,其中包含为该目标构建的二进制文件和一些元数据,消费者可以使用这些元数据来访问您的组件。 您可以在项目结构中为您生成的Products文件夹中看到框架文件,并且可以通过Finder的上下文菜单在Finder中打开每个文件的位置。 然后,您可以从Finder复制框架文件并将其托管在任意位置,例如可以从Web服务器下载的文件,也可以通过您管理的任何分发渠道发布该文件。 发布配置 您可能已经看到输出框架是使用Debug配置构建的,并且您可能希望在实际部署它们之前切换到Release。 要改为选择发布配置,只需从Xcode的顶部菜单中单击目标组合框,然后单击“编辑方案”。 然后,对于“运行”选择,将“构建配置”从“调试”更改为“发行”,关闭对话框,然后重新构建目标。 体系结构:iOS模拟器不是ARM! 但是你不流行。 您最终会注意到,即使您使用Release配置构建了iOS框架(以Touch后缀命名),也无法在所有架构上正常运行。 例如,如果您使用真实设备(或具有ARM体系结构的通用设备)构建框架,则输出框架将不适用于以模拟器为目标(使用x86体系结构)的iOS应用。 反之亦然。 因此,您还需要定义一个聚合目标,以便能够运行脚本以将为不同体系结构构建的框架“合并”为一个聚合的“胖”对象。 为此,请在新目标对话框的“跨平台”选项卡中创建一个类型为Aggregate的新目标,为其命名,如“ FramisTouch-aggregate”,并为其添加一个新的运行脚本阶段(使用“ +”按钮目标的“构建阶段”部分),并定义一些命令来执行所需的操作: 然后,可以通过构建聚合目标(很重要:之后)轻松地执行上述命令:通过从目标中选择通用iOS设备和模拟器,您已经在Xcode中构建了设备和模拟器框架(即针对两种类型的体系结构)组合框,然后重复构建输出。 您当然想知道这些命令实际上会做什么: 创建一个新目录(例如“ Release-iphoneaggregated”)作为目标(在项目的构建目录中); 将基于设备的框架的结构复制到新目录中; […]