Tag: Swift编程

Objective-C与Swift:您应该从什么开始?

一方面,Swift从一开始就告诉我们,他非常容易理解,另一方面,Objective-C具有自己的高输入阈值,对于初级程序员而言有时可能很难做到。 如果您对制作自己的应用程序的兴趣太大了,那么您会遇到一个问题-应该使用哪种编程语言:新的Swift或经过时间考验的Objective-C? Objective-C与Swift:让我们看看吗? 让我们看一下使用不同语言的相同代码的一些原始示例: 如果要初始化大量,则在Objective-C中您应该这样做: 在Swift中: 当然,即使在原始代码中,您也会看到比Objective-C更快,更易理解的语言。 让我们看看如果我们要制作像“ Hello World”这样的程序会怎么样 目标C: 迅速: Objective-C具有自己的特定且困难的语法,并带有大量不同的标记。 Swift更清晰,而且类型具有防御性,因为如果您忘记打印变量类型,则不必担心。 但是,如果您是初学者,则应该知道在何处使用哪种类型。 Objective-C与Swift:为什么我需要这个? 重要的是,您打算做什么以及需要什么? 让我们来看看每种语言的优缺点! 工作方式: 几年前,当Swift发行时,您不知道Objective-C就找不到工作,因为所有公司都在Objective-C上对其应用程序进行编程,因此很难将Swift实施到Objective-C中。 今天,一切都变了。 所有公司都知道Swift是一种快速发展的语言,并开始在其应用程序中使用它。 另一个非常重要的时刻是稳定性。 Objective-C已经使用30年了,而不是只有4岁的Swift。 当然,例如,您不能在新程序中使用Swift的早期版本,因为它相差太多,这在Objective-C上无法说清楚。 您可以使用已有5年历史的代码,它将可以正常工作。 为了娱乐: 如果您不想在公司工作,并且计划快速而轻松地制作自己的应用程序,那么您需要Swift。 Swift中的代码简洁明了,这降低了初学者的入门门槛。 但是不要放松。 由于进入门槛低,Internet充满了不合格代码。 因为许多人在没有必要的知识的情况下开始进行编码。 好吧,如果我们总结一下-Swift适用于最新的应用程序以及快速轻松的入门。 Objective-C是旧平台的工作和支持所必需的,但是很难研究它,但是该选择什么呢? 这个问题没有确定的答案,但是我试图让您考虑您的优先事项,这应该有助于确定。 一些材料来自:https://goo.gl/nJ5hnG

iOS黑暗主题

显然,如果我们计划支持更多主题,则我们必须选择其他数据类型(例如,您可以选择Integer类型并创建带有所有主题的枚举类型)。 另外,我还创建了一个简单的帮助程序类来获取/保存设置。 我有一个动作连接到Dark mode开关。 现在,当用户更改主题时,我们可以在应用程序中的任何地方捕获该通知。 基本控制器 当然,如果我们在每个视图中分别捕获通知,那将不是最佳选择。 我们可以在这里创建基本控制器类并自定义大多数内容。 当我们在视图中有特定的东西时,我们可以重写方法之一: enableDarkMode或disableDarkMode 。 表格视图的基本控制器。 用于视图的基本控制器。 现在,当用户更改主题时,我们的通知将捕获到我们的基本控制器之一中,并且应用程序正在更改视图样式。 您可以在GitHub存储库中检查整个解决方案: 姆恰楚斯基/ vcoin 通过在GitHub上创建一个帐户为vcoin开发做出贡献。 github.com 我希望这可以帮助你!

Z世代的最佳职业选择:iPhone应用程序开发

了解为什么Z一代热衷于成为最好的iPhone应用程序开发人员。 作者浏览了不同世代之间的职业品味变化。 IAS的(行政官员)医生。 工程师。 律师…曾经有一段时间,孩子们想成为其中一员。 但这是为了X世代(1960–1980)。 随着WWW时代的繁荣,千禧一代或Y世代(1980-2000年)的情况发生了很大变化,并且改变了出生于此的孩子的职业目标。 随着诸如软件开发和Web开发之类的IT机会的出现,吸引了X一代人的有利可图的选择在某种程度上被淡化了。 此后,IT部门再也没有回头路了。 Z世代发生的显着变化是台式机使用的减少和用户向智能手机的转移。 没有任何假设, iPhone就成为了主导力量。 随着iPhone的普及创造了新的记录,我们有了一个称为iPhone应用程序开发的新学科。 如果您今天的孩子回答这个非常简单的问题是:我想成为最好的iPhone应用程序开发人员 ,您今天就不会感到惊讶。 对于最佳的iPhone应用程序开发人员以及每个iPhone应用程序开发公司而言,这都是一个时刻。 App Store处于成功的顶峰。 按下反向按钮,您将了解到Apple在不到8年的时间里取得了非凡的成功。 该节目始于2008年 ,最初有500个应用程序,如今已成为一个轰动性的高潮–如今,它已拥有150万个应用程序 ,超过1000亿的下载记录,在全球范围内拥有超过1000万注册的iOS或iPhone应用程序开发人员。 苹果公司知道其价值,因此,它确实给了他们通过App Store获得的收益中的一小部分。 到目前为止,该公司已向最佳iPhone应用程序开发人员提供了超过400亿美元的资金 。 除了给他们应得的利润份额外,它还相信分享关于最佳iPhone应用程序开发的知识和技能。 为此,它每年为此举行一次全球iPhone开发者大会。 它了解他们的挑战,并为他们提供所需的解决方案。 参加者有机会与Apple工程师进行深入的技术知识讲座。 这有助于他们提高性能并交付高质量的应用程序,以吸引日新月异的iPhone消费者。

在Swift中避免原始痴迷

确保您的代码代表要解决的问题称为域建模 ,这是软件工艺的重要组成部分。 这意味着您应该创建代表问题的类( 或结构! ),而不是使用字典或元组之类的结构来存储信息。 创建这些域概念的好处是,您可以创建更丰富的API,并减少开发人员理解一段代码所花费的精力。 领域建模的反面-使用基元表示复杂的想法-被称为基元痴迷,是一种代码味道。 例如,通过将网站存储为String来表示网站的URL。 与String相比,URL具有更多信息和特定属性(例如,方案,查询参数,协议),并且通过将其存储为字符串,您将无法在没有其他代码的情况下访问这些特定于URL项(域概念)。 作为域建模的一部分,您要针对两件事: 使代码尽可能说明性,而无需文档 充当其自己的文档的代码是软件开发的重要内容之一。 如果代码以这种方式进行自我记录,则说明文档将永远不会过时,因为它是代码本身的一部分。 您不必每次更改代码都记得要更新文档,这很容易忽略。 防止以对业务无济于事的方式滥用您的代码 好的代码经常被忽略的一件事是,它很难做错事情。 需要URL的函数应将URL作为参数,而不是字符串。 如果该函数的用户可以传递String可能会更容易,但该函数现在必须确保String实际上也是URL。 通过强迫用户执行此操作,您将给他们带来一些负担,同时还可以防止他们不仅滥用您的API,而且可以滥用它。 让我们专注于这段代码,看看如何更好地对此建模: func showDetailsForEmail(withId:String){ //推送新的视图控制器 } 使用类型别名 typealias是一个关键字(在Objective-C和Swift中都可用),用于显示代码中的其他内容可以轻松表示的位置: typealias EmailId =字符串 func showDetailsForEmail(withId:EmailId){ //推送新的视图控制器 } Typealiases很好地解释了在这种情况下可以使用什么,它们满足了第一个目标(使您的代码更具解释性)。 在这里,通过查看功能签名,您可以看到发送到该功能才能使其正常工作所需的内容-电子邮件的ID。 以前,当函数只需要一个String ,该字符串应代表什么以及如何创建一个字符串就不太明显了。 将一个完全不相关的String传递给方法,这太容易了,这不是您想要的。 不幸的是,类型别名未能满足第二个要求-防止滥用API。 类型别名是另一个对象的“昵称”。 它们不是单独的类型,因此不会阻止在其位置使用“昵称”类型。 即使上面的函数需要一个EmailId ,您仍然可以在其位置传递一个String (或什至其他类型的别名): typealias EmailId =字符串 typealias SMSId =字符串 func showDetailsForEmail(withId:EmailId){ //推送新的视图控制器 } 让smsOne:SMSId […]

Swift 3的MVC架构简介

MVC背后的梦想 MVC是用于强大的面向对象编程的强大iOS体系结构模式。 它可以将应用程序的数据/逻辑,视图和控制器清晰地分开。 理想情况下,模型和视图不应直接交互,而控制器应进行调解。 如果使用后端或本地存储系统,则更新模型对象的逻辑应在这些模型文件中。 视图应该是“哑”的,并且只能处理与演示文稿相关的任务。 现实 大规模视图控制器。 通常,遵循MVC设计模式的应用程序具有绝对庞大的视图控制器文件,可以执行所有操作。 另外,您的应用程序一定会违反MVC规则,这几乎是不可避免的。 视图可能会直接与您的应用程序数据交互,或者模型可能会更新用户在屏幕上看到的内容。 根据MVC和Apple的说法,这是不容忽视的,但它一直都在发生。 我应该为我的应用程序使用MVC吗? 如果您只是刚入门或正在构建相对简单的应用程序,则MVC很可能是完美的。 让UIViewController对象做很多不同的事情是创建简单应用程序的一种非常简单的方法。 MVC已建立并且有据可查,因此很容易找到很好的例子。 Apple关于MVC的文档: https://developer.apple.com/library/content/documentation/General/Conceptual/DevPedia-CocoaCore/MVC.html 一些替代方案: MVVM —模型,视图,ViewModel Swift中的MVVM – Artsy工程 模型视图ViewModel已成为我在iOS上编写应用程序的默认方式–它使编写iOS应用程序变得很有趣。 我写了…… artsy.github.io VIPER —视图,交互器,演示者,实体,路由 使用VIPER构建iOS应用程序·objc.io objc.io出版有关iOS和OS X开发的高级技术和实践的书籍 www.objc.io 对于初学者来说,其他设计模式可能较难入手,但是,如果您要开发复杂的应用程序,那么从长远来看,了解和采用MVVM或VIPER可能对您和您的团队有所帮助。 当今,大多数流行的应用程序都使用自己的设计模式-通常是传统模式的混合。 给那些使用MVC的人一些最终提示 给您的对象明确的责任,不要偏离他们。 使您的视图可重用,灵活且可测试。 尽量保持控制器清洁。 调试会容易得多。

Swift中的内存管理:了解强引用,弱引用和未引用

在我们正在执行的所有编码的背后,您可能在编写代码时注意到一些变量,它们引用了strong , weak或unowned 。 他们到底是什么意思? 通过以strong为参考声明所有变量,是否会使您的变量更强? strong , weak或unowned的用法实际上与Swift中称为自动引用计数(ARC)的内存管理有关。 让我们放慢一点,尝试了解这里的含义。 因此,ARC实际上会进行自动引用计数。 在计算机科学的定义中, 引用计数是一种将引用,指针或句柄的数量存储到资源(例如对象,块或内存,磁盘空间或其他资源)中的技术。 简而言之,ARC实际上有助于将引用存储到内存中,并有助于在不使用引用时进行清理。 另外,在这种情况下,引用计数仅适用于类的实例,不适用于结构和枚举,因为它们都是值类型,而不是引用类型。 在进一步介绍之前,为什么内存管理这么重要? 由于内存管理在分配内存中起着巨大的作用,因此程序确实可以在用户的​​请求下执行,并且在不再需要时可以免费重用,因此这确实是一个大问题。 但是,如果您耗尽内存,会发生什么呢? 该任务将停止执行,这意味着您将无法执行任何任务。 该任务可能不会继续执行,但会继续运行,直到达到极限并且程序崩溃为止。 您可能不希望用户使用越野车程序。 什么是自动引用计数(ARC)? 如官方文档中所述, 内存管理在Swift中“行之有效”,您无需自己考虑内存管理。 当不再需要类实例使用的实例时,ARC会自动释放它们。 ARC还跟踪信息,例如了解代码之间的关系,因此ARC能够有效地管理内存资源。 ARC如何工作? 每次通过init()创建类实例时,ARC都会自动分配一些内存来存储信息。 更具体地说,该内存块保存实例以及属性值。 当不再需要该实例时,将调用deinit()并且ARC将释放该实例的内存空间。 使用下面的代码,这很容易解释,但是我仍然希望您了解代码的作用。 这是带有Person实例和Gadget实例的两个类的示例, Gadget具有init方法,该方法将设置实例的属性,这意味着将任何信息分配到内存中。 同样,在deinit ,我们将看到实例被释放,这意味着包含信息的内存将在我们的情况下释放。 强vs弱vs无主-事实 通常,在创建属性时,除非引用被声明为weak或unowned否则引用为强。 将属性标记为weak ,它将不会增加引用计数 介于两者之间的是unowned引用,它们既不是强引用,也不是可选类型。 编译器将假定对象没有被释放,因为引用本身仍然保持分配状态。 强大的参考 让我们看下面的例子。 我们有一个Person类型的变量,其引用为“ Kelvin”,一个Gadget类型的变量,其引用为“ iPhone 8 Plus”。 查看控制台消息。 您应该看到两个变量都已正确初始化。 现在,添加以下代码kelvin分配iphone并设置iphone的owner 。 在将kelvin和iphone设置为nil之前,请确保插入代码: 好的,在Playgrounds中再次运行代码。 您应注意,控制台仅显示有关初始化的消息。 […]

自定格单元

使用Swift在iOS中使用TableView和CollectionView App Store上的大多数iOS应用程序都有一个项目列表的UI表示形式,因此很明显,iOS开发人员在整个开发过程中花费了大量的时间使用TableView和CollectionView。 自2009年以来,在AppIt Ventures,我们一直在开发iOS应用,并适应iOS提供的所有技巧,改进和新功能。 在本文中,我们希望共享一个称为“自调整大小的单元格”的概念。 尽管这不是一个新话题(iOS 8宣布了这一话题),但我们希望通过Self-Sizing Cells帮助初学者了解更多详细信息和用例。 在iOS 8之前,在具有不同高度的单元格的TableView或CollectionView中显示动态内容并不是一个容易的过程。过去,我们不得不以编程方式计算每个单元格的高度并增加相应单元格的高度。 使用自调整大小的单元格时,显示高度可变的动态内容是一个简单的过程。 将自动布局用于tableview单元内的UI元素。 将Tableview rowHeight设置为UITableViewAutomaticDimension 。 设置estimatedRowHeight或实现高度估计委托方法,并且此estimatedRowHeight将是单元格的默认高度。 设置这两个属性后,系统将使用“自动布局”来计算行的实际高度。 EstimateRowHeight是情节提要中原型单元格的高度,当rowHeight属性设置为UITableViewAutomaticDimension我们告诉tableview根据单元格中添加的其他约束来计算单元格高度。 让我们看一下如何演示如何将tableview告知自身大小的快速演示 。 创建一个示例报价列表演示,以在表格视图中显示带有作者姓名的报价,并使用自定义单元格将表格视图单元格设置为自定义表格视图单元格。 在此示例演示中,我们将展示如何创建支持动态类型的自定义TableView单元格 。 由于动态类型使用户可以控制在单元格中显示的文本的大小,因此,必须根据文本大小调整单元格的大小,这一点很重要。 在情节提要中 ,使用tableview单元格并在其中添加两个标签。 2.我们必须在View控件r中添加以下两个Tableview委托方法。 要么 我们可以在viewDidLoad方法中添加以下两行代码。 3.在数组中加上一些引号,然后将其分配给indexPath()方法中cellForRow中的引号描述标签,有关结果,请参见下文。 在上面的结果屏幕中,我们没有得到预期的结果,因为我们需要将报价描述标签的行数设置 为零 。 设置好之后,最终结果如下。 与tableview演示类似,我们必须按照以下步骤将自定义集合视图单元格设置为自定义大小的 collectionView单元格 。 对UI CollectionView单元内的UI元素使用自动布局 。 设置UICollectionViewFlowLayout的EstimatedItemSize 。 设置systemLayoutSizeFitting为 UI CollectionView单元格。 estimatedItemSize是CollectionView中原型单元格的估计大小。 当我们将systemLayoutSizeFitting属性设置为CollectionView单元时,CollectionView根据其当前约束返回最佳视图大小。 就像我们对TableView所做的一样,让我们​​为CollectionView创建一个报价列表演示,并使用自定义单元格显示作者照片的报价。 我们必须在CollectionView自定义单元格类中添加以下方法。 在情节提要中将行数设置 为零 在CollectionView单元格(如TableView单元格)中获取报价描述标签。 最后,看到用于自定义UICollectionView单元格的结果屏幕。 注意:上面创建的CollectionView演示在UI和空格方面存在问题。 […]

字典和元组之间的区别

词典用于存储相同类型的无序值列表。 每个值都与唯一键相关联,该键充当字典中该值的标识符。 让我们创建示例字典 var studentDetails = [String:String]() 它也是一种可变类型,意味着您可以通过添加,删除或更改其项目来进行更改。 studentDetails [“ firstname”] = [“ Roy”] 元组表示单个组件中的值的集合。 在可以返回多种类型的函数时使用。 我们可以使用dot( . )表示法后跟值的索引来访问内部值: var name = [“ Joy”,“ Martin”] var firstname = name.0 var lastname = name.1 它可以是零个或多个类型的组合。 var value = [“ joy”,1,true] 元组上方是(String,Int,Bool)类型。 元组和字典之间的主要区别 元组是逗号分隔的多种类型的列表,字典是键值类型。 元组只能包含预定义数量的值,在字典中没有这种限制。 元组可以包含具有不同数据类型的不同值,而字典一次只能包含单个数据类型的值。 谢谢阅读。 如果您喜欢本文,请确保鼓掌以表示支持。

发电机em Swift

简介 生成器的primerira pergunta que vemàcabeçaépor te mos entent? Essa perguntanãoabrange somente o tema deste post,mastambémos diversos tipos de objetos quesãoutilizados pela suaaplicação。 重要信息: 量化“框架/ API / SDK”…的可用性,重要信息在实现影响方面具有重要意义códigodo seu应用程序。 紧急情况下的紧急情况: 基本的基础是todas,即“ Swift Swift”中的“ Collections e Sequences”。 您可以使用实用程序或命令来创建公用程序,也可以使用公用程序来替代公用程序。 O发生器 使用简单的协议即可:最基本的示例,最常见的示例: 协议类型Generator类型和简单性,续实现。 next(),公用事业证明人,要素“ eo”,在公共交易中使​​用附加条件的人。 PodemosImplementá-loda seguinte maneira: Bem,请立即给我起名:“ Para que diacho eu vou utilizar isso?”。 生成器类型的实用程序,可以在saber或ococre dentro da的实现中胜任,而algas可能会在下一个页面上显示下一个错误。 […]

使用Swift建立倒数计时器

在情节提要中创建新的视图控制器 添加按钮和标签: “播放” , “停止” , “重置” 3. ScheduledTimer和更新计时器方法 问:为什么“ func”需要添加@objc ? 如何修复“ #selector的参数是指未公开给Objective-C的实例方法”…… 通过这些免费教程 www.hackingwithswift.com 学习iOS的Swift编码。 4.重置/停止/减少/增加实施 Swift的计时器有一个称为invalidate()的方法,它将停止计时器。 有关完整的项目源文件,请访问GitHub