上周,我进行了一项调查,以更好地了解iOS开发人员的喜好和品味,我的目标是收集信息和反馈,并使用这些数据作为该杂志上未来文章的输入。 看起来有人试图逃避自己的意见,对吗? 除了笑话,总是可以使用更多数据做出决策,这是一种很好的方式,首先可以让听众听到他们感兴趣的内容。 您可以在此处找到有关该调查的更多信息。 免责声明** 首先,我必须说,这个结果没有成为iOS社区声音的幌子,而且它们肯定没有统计上的显着性。 到现在为止(出版时间),只有22个人足够捐出5分钟的时间用于慈善事业。 就是说,我仍然认为,在下面您可以找到很多反馈和见解。 给我看钱..我的意思是见识.. Q1,您喜欢哪种学习形式? 第一个问题是关于学习习惯,以及受众如何喜欢使用iOS内容。 截屏视频占了最大份额,紧随其后的是博客文章和源代码 ,这对博客作者而言是个好消息。 关键见解 如果您要创建包含截屏视频的博客文章,并且要通过GitHub来访问源代码, 那绝对是对的! Q2,您使用什么语言? 第二个问题是关于过去x未来,因为我们都知道swift是一种令人惊讶的语言,它是有史以来使用率最高的语言之一,但是仍然存在普通objc的空间。 关键见解 没有办法从迅捷中退回,为什么有人要这样,对吗? 就是说,很高兴拥有objc的经验。 **此图表可能因行业,应用程序利基和许多其他原因而发生巨大变化。 为了便于讨论,让我们继续关注22个善良灵魂的小宇宙.. =) Q3,哪些书可以帮助我度过难关? 问题三是关于书的。 尽管人们学得不同,但很多时候没有更好的方法来获得最终的20%(80 | 20)。 无论您走到哪里,诸如Clean代码,Big Nerd Ranch书籍,objc.io书籍之类的书都始终显示在顶部,我绝对会建议您看看。 Q4和Q5,好的ios内容在线..在哪里? 问题四和五与在线上出色的ios内容有关。 我们很幸运,可以生活在一个人真正可以成为大师而无需离开家的时代。 社交互动,大学,离线课程等仍然一如既往地重要,但替代方案每天都在增加。 从站点到闲散社区,twitter帐户,github存储库,电子邮件列表,学习平台,udemy等。 列表不断变得越来越好。 Realm.io,objc.io,nshipster,raywenderlich,WWDC会话,natashTheRobot, 一点点可可,iOS开发者每周,appcoda等。这只是在线上可提供的惊人内容的一个示例。 关键见解 在线上有很多很棒的内容,如果您想学习iOS并真正精通它,现在是时候了, 没有更多借口了 ! 简而言之.. 再过几天,我将发布本博文的第二部分,其中包括调查的更多见解和反馈。 下一篇文章将解决以下问题 : –您最喜欢iOS平台什么? –您对iOS开发有什么不满意的地方? –您能告诉我们您在iOS平台上确实不喜欢的东西吗? –您想在iOS课程中看到哪些内容? 更新: 您可以在此处检查第二部分。 与往常一样,任何想法,疑问或反馈都值得欢迎。 […]
这是遍历Swift声明( typealias )的超快速博客。 苹果公司将其描述为: 类型别名声明将现有类型的命名别名引入程序。 简单来说,这意味着您可以命名( 别名 )现有类型,例如String , Int或Bool ,实际上几乎是任何名称(不包括某些swift keywords )。 这可以使您的代码更具可读性。 让我们看一下我们之前使用的示例: //此示例中的购物篮是一个Items数组。 其中项目是字符串的类型别名 typealias项目=字符串 typealias篮子= [物品] var篮子:篮子= [] basket.append(“ Apple”) 这意味着可以将Items添加到Baskets 。 这比将Strings添加到[String]更具可读性。 此处的Items可以与其父类型String完全相同的方式创建。 让项目:项目=“苹果”
在使用Swift时,我在函数式编程环境中进行了越来越深入的研究。 在其他编程语言(例如Python或Haskell)中使用的许多技术可以迅速获得。 今天,我想向您介绍其中一种,称为currying。 Swift是一种出色的编程语言,它利用了函数式编程的优势。 函数式编程的主要好处之一是函数是高阶公民,这意味着迅速使用函数可以执行以下操作之一: 将一个或多个函数作为参数 返回一个函数作为参数 最近,我在函数程序员Curry中发现了一种众所周知的技术。 Currying用于将具有多个参数的函数分解为一系列包含参数的函数。 当您想提高代码的可读性和可重用性时,此技术变得非常有用。 该函数如下所示: 如您所见,咖喱是一个简单的功能。 它以一个函数作为参数( fn ) 首先返回一个函数 ,该函数采用传入参数的函数的第一个参数传递给curry(此处为A ): (a: A) -> (B) -> C 然后,它返回一个函数 ,该函数采用传递给curry的函数的第二个参数(此处为B ): (b: B) -> C 最后,使用参数A和B调用作为参数传递的函数 : fn (a,b) 值得注意的是,函数fn仅在最后一个参数传递给curried方法时才计算 。 在某些情况下,此方法可能有用,其中一种情况是您希望使现有方法更方便或可重复使用: 让我们采用以下日志方法: 使用两个参数调用它可能变得很乏味,使用curry我们可以使它可重用且更明确,而无需创建一个封装参数的新函数。 充分利用高阶函数的优势,我们可以分解logMessage并创建一个变量,该变量是一个将日志消息作为参数的函数,然后将其记录在调试级别。 另一个用途是利用诸如map , forEach等功能性方法。 让我们来看下面的例子: 如您所见,使用currying可以很容易地部分应用任何方法。 (Vincent Pradeilles在我当时所在的CocoaHeads展示了这种用咖喱粉的用例。) 如果您正在使用RxSwift或计划使用它,您可能想知道如何将使用completionBlock的异步代码迁移到一系列Observable。 重构所有代码库只是为了使其可观察而不是(completionBlock /成功和失败块)通常是不可行的。 使用curry和扩展,您几乎不需要代码即可实现。 Rx + FromAsync […]
具有动态大小的UICollectionViewCell 如果您要使用动态尺寸的集合视图单元格,可以按照以下两个简单步骤操作: 在控制器类中设置UICollectionViewFlowLayout的EstimatedItemSize属性。 在您的UICollectionViewCell子类中实现preferredLayoutAttributesFitting方法。 3.步骤2的替代方法是使用下面的类作为UICollectionViewCell子类的基类。 请评论您的改进建议。
客户完成交易的整体效果,可从trazendobenefíciose reduzindo quickamente os custos daconcessionária获得客户的赞誉。 Em 2015 eu tra balhava em uma empresa chamada Redsuns,que entrrou as atividades em Abril do mesmo ano,apóso encerramento eu assumi todos os projetos da mesma,afinal de contas,alguns clientes equer poderiam saber que a que。 不可抗拒的权利,不可抗拒的理由是:可以在任何情况下获得必要的权利,并获得解决方案。 一个意识形态时代的蟒蛇,pris uma plataforma depós-vendasparaconcessionárias。 纳科莱·阿诺(Naquele ano),本·科莫·阿因达·奥兰德(décoméainda ocorre durante)担任着一份写后的职务,就像万达斯·德·卡洛斯·诺沃斯·埃斯塔瓦姆的《超级回忆录》,《爱丽丝梦游仙境》一样。 零售店,4 Itil Tecnologia,购物商场,mas queria fazer […]
本课程的目标是教任何人如何从头开始构建iOS应用。 该课程非常基于项目,是专门为没有编程经验的初学者设计的。 而且,如果您有编码经验,那么本课程将使您从编码爱好者到中级水平,并准备开始新的技术职业。 您将首先通过示例学习Swift语言的基础知识: **变量和常量 ** **控制流 ** **数据类型 ** **对象,类和结构 ** 枚举 您将通过操场上的演示和挑战学习iOS编程的基础知识。 这将为您开始构建iPhone应用程序打下坚实的基础。 接下来,您将开始构建简单的应用程序以扩展您的知识并完成一个顶峰项目:SwiftAgram,Instagram克隆应用程序。 在这最后的5小时以上的教程中,您将运用自己的技能来构建具有更多高级功能的类似Instagram的多视图应用程序,例如: 在TableView中显示联系人 联网以显示Web内容 从照片库(UIImagePickerView)导入图像 实施Facebook用户身份验证和监控(Facebook登录SDK) 使用Firebase即服务数据持久性(BaaS)启用数据持久性和同步 将向您介绍Firebase作为云后端服务,以通过数据持久性和同步来管理您的应用程序。 并且,您将获得有关如何使用Facebook Login SDK通过您的Facebook帐户启用用户身份验证的分步指南。 为什么要上这门课? 本课程将帮助您成为一名出色的iOS开发人员,并在那里建立对iOS生态系统的基本了解。 您将学到什么: 使用类和对象 使用Storyboard Segues创建多视图应用程序 使用TableView,导航栏和工具栏 添加交互和手势 持久数据 联网以将Web内容嵌入到您的应用程序中 使用MapKitView&Geolocation在地图上显示用户的位置和地址 使用初学者指南学习iOS动画以为您的应用程序增添优势 您将要构建的应用程序: 带有TableView,UIDatePicker和Core Data Framework的Todo List Swift应用 带有AV Foundation Framework和AVAudioPlayer类的有趣MP3播放器 一个Google餐馆应用程序,可使用Google Places API,Geolocation和MapKitView定位附近的餐馆。 带有纽约时报开发人员API的NewsReader应用程序,用于显示最受欢迎和最受欢迎的NYT文章列表 先决条件和要求: 您需要访问运行OS X 10.10或更高版本的Mac计算机 […]
最近,我在一个本地用户组中,出现了热门的跨平台移动开发新选项的话题(实际上并不重要)。 有一种通常的UIkit重击,这是可以预期的,因为该主题是提出一种替代编程模型。 我不是要捍卫UIkit,因为我同意它可以进行一些改进。 但是,演讲者确实说了我以前听过的有关自动布局的一件事,这使我误解了。 我听说有人说“您需要数学博士学位才能理解自动布局”,或者“您需要成为一名火箭科学家才能理解“自动布局”。”火箭科学实际上是-您可以在reddit上找到答案。 取而代之的是,在此博客文章中,我将向您展示自动布局的计算有多么容易。 实际上,线性方程是如此简单,以至于小孩子可以进行数学运算。 那么,为什么人们认为“自动布局”很难? 好吧,我认为Xcode的界面生成器无法解决这种情况。 自从引入“自动布局”以来,Xcode已有所改进,但是仍然很难看到“自动布局”方程与您在界面生成器中看到的关系。 让我们看看我能否稍微揭开“自动版式”的神秘面纱。 等式 假设您有两个按钮,并且想知道将它们分开的距离。 我们如何表达“取消”按钮的右边缘和“接受”按钮的左边缘之间的关系? 如果我要向另一个人描述这个问题,我可能会说类似“接受”按钮在“取消”按钮的右边八点。 更为精确的说法是:“接受按钮的左边缘比取消按钮的右边缘大八点。”其等式为: Accept.left = Cancel.right + 8其中8为常数 如果要表达“接受”按钮的宽度相对于“取消”按钮的宽度怎么办? 假设它的宽度是原来的两倍。 然后,等式如下: Accept.width = Cancel.width * 2其中2是一个乘数 Auto Layout方程将这两者合而为一,以表达任何类型的关系约束。 Item1.attribute = Item2.attribute *乘数+常数 为了表示“接受”按钮相对于“取消”按钮的位置,我们不需要乘数,因此其值为1。 等式如下: 接受左=取消右* 1 + 8 为了表示“接受”按钮的宽度,我们不需要常数,因此该常数为零。 接受宽度=取消宽度* 2 + 0 而已! 您需要数学博士才能找出¯\ _(ツ)_ /¯的神秘方程。 与任何方程式一样,您可以将其取反。 您可以通过反转项目1和项目2来表示这两个按钮的距离之间的关系,如下所示: 取消右=接受左* 1 +(-8) […]
更新于2019年2月24日,格林尼治标准时间上午4:51 5:30+ 先决条件—任何Swifty iDev均可初学者或专家阅读。 通过从头到尾阅读本系列文章,初学者将获得知识,专家将增强其知识。 我们都知道Apple的UIKit,MapKit和所有其他框架都是在委托模式的基础上开发的。 大多数iDev都知道协议是用于委托人和数据源在视图,视图控制器或自定义类之间传递和请求数据的,但是该协议的真正功能是类型转换 ,AnyObject是迅速实现的协议,用于存储任何类型的对象。 类型转换是将变量或值的数据类型从一种类型转换为另一种类型的过程。 我还有一个问题,如果上面是类型转换,那么协议在这里的作用是什么? 当然,经过几个动作,我会给这个问题一个答案,敬请期待。 让我们首先介绍基本概念。 以上只是原始类型转换的一个简单示例。 原始类型转换是由Int,Float,Double等编程语言提供的原始数据类型之间的类型转换。 另一种类型转换是类级别的类型转换,有时称为自定义类型转换。 类,结构,枚举被视为可以由像您这样的开发人员创建的自定义类型,自定义类型转换在继承中起关键作用。 — — — — — — — — — — — — — — 该类的每个实例都有#n个类类型 — — — — — — — — — — — — — — 如果A类不是任何类的子类,则#n将为A类 [例如(A类)— A没有任何超类] — — — — — — — […]
抱歉,延迟了,但是在阅读了文章之后,我意识到NasaAPOD应用程序的当前安装方式对于实施VIPER并不是很有趣。 应用程序内部需要进行更多的交互,因此我回到了MVC,MVVM和MVP来全面实现相同的功能。 我所做的是添加了“收藏夹”功能,该功能只是将您的收藏夹移到表视图的顶部(实际上并没有保存任何内容)。 因此,至少MVP和VIPER现在更加有趣了。 我不确定的一件事是如何为单元设置演示者/交互者。 似乎应该有一个presenter / interactor组件,因为它还可以处理图像缓存。 但是我不能完全考虑如何确保我没有制造大量或可能泄漏的材料。 auth0.com教程肯定有很大帮助,所以我的VIPER应用程序很大程度上基于它。 我发现有些奇怪,但根据以前的工作是很正常的,是当用户点击某些内容时,它会通过演示者而立即返回视图。 例如,用户点击信息图标,视图告诉演示者用户点击,演示者返回查看告诉其发生点击并显示详细信息。 auth0网站还建议您不要手动创建所有文件(我做了🙃),他们建议使用工具为您生成文件。 因为我决定手动创建所有文件,所以我确实很难考虑应用程序所需的每个文件的所有交互和协议。 如此之多,以至于我把它抽了出来。 我所做的一件事有些不同,那就是该应用程序如何设置演示者和交互者。 auth0站点将这些变量公开,但是我想尽可能地保持所有私有。 所以我添加了attachView(viewInteractor:) , attachInteractor(interactor:)和attachPresenter(presenter:)函数。 您可以在下面看到完整的应用程序。 ashleyng /建筑设计模式 通过在GitHub上创建一个帐户来为ArchitectureDesignPatterns开发做出贡献。 github.com 到目前为止,这是最有趣的学习模式,并且肯定有很多设置需要使它起作用。 话虽如此,我现在不认为VIPER是我的选择。 我仍然不太了解Router部分,但是如果没有Router ,也许还有VIPER的味道? 比较MVVM和Viper架构:何时使用一种或另一种 TL; DR:设计良好的体系结构对于长期保持项目可维护性很重要。 在这篇文章中… auth0.com 视图,交互器,演示者,实体和路由器 视图 —界面层(UIKit文件)。 视图负责显示演示者要求他们执行的操作,并将用户输入回传给演示者 Interactor —负责从模型层(使用网络或本地数据库)获取数据,并且其实现完全独立于用户界面。 演示者 —查看逻辑以格式化要显示的数据。 这是MVVM中ViewModel完成的工作的一部分。 演示者从交互器接收数据,创建视图模型并将其携带到视图。 还对用户输入做出反应,请求更多数据或将其发送回交互器 实体 -模型层职责的一部分。 没有业务逻辑的纯数据对象。 由交互者管理。 路由器 -应用程序的导航逻辑。 示例:如果必须在iPad应用程序中重用相同的iPhone视图,则唯一可能改变的是视图的显示方式。 这使您的其他图层保持不变。 示例应用 视图 […]
今天我们将讨论中介者模式。 让我们从现实世界中的场景开始,而不是解释抽象定义。 在团队中,有PM,开发人员和QE。 当开发人员完成对新功能的编码后,这些代码将提交给存储库。 其他股东(如量化宽松和PM)需要通知。 protocol Collogue { var id: String { get } func send (message: String ) func receive (message: String ) } class Developer : Collogue { var id: String var qe: QE var pm: PM init (qe: QE , pm: PM ) { self. id = “Developer” self. qe = qe […]