如果您从未听说过,请尝试! Swift是该领域最新的iOS会议之一。 于2016年3月在日本首次开始尝试! Swift已迅速成为国际会议,最近将班加罗尔作为今年的第三站也是最后一站。 该会议由Natasha Murashev( @ NatashaTheRobot)组织,他还负责运行本周Swift iOS新闻通讯( 强烈建议注册)。 本月初,我有机会参加我的第一次尝试! 在纽约市召开的Swift会议。 关于会议 这次单场会议涵盖了三天-一个会前研讨会+两个主要会议日-并有20多位演讲者进行了精彩的演讲。 我真的很喜欢这次会议的形式,每次演讲大约持续20-30分钟,并在“办公时间”直接与演讲者取得联系。主剧院外面有一个专用空间,每个演讲者在发表演讲后都会立即提出问题。他或她的讲话。 除了所有出色的演讲者之外,我还认为iOS社区中有一些“大牌”。 服务器端Swift领导者(如乔纳森·古思里(Swift Perfect))的支持得到了支持,后者主持了服务器端Swift研讨会。 和Tanner Nelson(Vapor),他通常在服务器端Swift和Vapor上做过演讲。 RxSwift的创始人Krunoslav Zaher就称为RxFeedback的新RxSwift架构进行了演讲。 还有一些知名的博客作者,例如Soroush Khanlou(khanlou.com),他不是日程安排发言人,而是为生病的主持人做准备。 其他博客老手包括Matt Gallagher(cocoawithlove.com),他做了出色的视图驱动的应用程序演示; 和运行RxSwift研讨会的Ash Furrow(ashfurrow.com)。 最喜欢的谈话 这些是我最喜欢的会议演讲的笔记。 尽管所有讲座都很精彩,但这些演讲与我目前在iOS开发中的熟练程度和兴趣最为相关。 如果可能,我已经提供了指向代码和/或演示者注释的链接。 当我发现发布了更多演讲者材料时,我会尽力保持页面更新。 还值得注意的是,所有演讲均由Realm录制,并且视频/成绩单将很快发布! 2017年9月26日更新: Realm已开始发布来自try的视频! Swift NYC2017。在Realm Academy的会议页面上查看它们!
当我们使用UIScrollView时,它会受到管理限制。 因此,这是使用AutoLayout管理UIScrollView的简便方法。 所以我们开始吧 步骤:1选取一个UIScrollView。 步骤2:将Constrain设置为0,尾随,前导,顶部和底部。 步骤:3取一个UIView来管理UIScrollView。 因此,控件的实际层次结构如下所示: 步骤4:将UIView的Constrain设置为尾部,前部,顶部和底部,并设置0。 步骤:5现在我们可以看到AutoLayout问题,因此,我们还向UIView添加了2个约束,如SuperView的Equal Width和Equal Height的给定与您想要的相同(我在这里给出1900以进行测试) 步骤:6运行该应用程序并进行测试。 您可以观看视频: 下载代码: https://github.com/javedmultani16/UIScrollView
程式自学十年心得:想吃这行饭,学好演算法与资料结构才能让你站稳脚步| 科技橙 TO精选观点《 TO … buzzorange.com 如何使用Xcode Targets去管理开发和上线建置(开发和生产版本) 对初学者而言,或许会有疑惑为什么要把App的数据库和开发环境分开处理。原因很简单,就是为了日后App建立新特性或延续开发时需要在开发版本和现存版本分别进行测试。一般软件开发都需要在不同的环境进行不同版本的测试。而App… www.appcoda.com.tw 独立的开发和生产Firebase环境 我正在考虑将Firebase用作MBaaS,但是找不到以下问题的可靠解决方案:我… stackoverflow.com [Swift]物件导向程序设计(面向对象程序设计) 我想很多人在某些事物导向的时候,都会像上面的小剧场一样,用乏善可陈的口气念完从维基百科上面的硬背的内容。 medium.com
这篇文章介绍了一种处理UIView实例上的轻击检测的方法。 它显示了如何在新实体中提取重复行为并将其与UIView的实例组成,而不是扩展UIView类,如何提高简单性,可重用性和可扩展性。 如今的问题 用户点击UIView时触发动作就像将UITapGestureRecognizer添加到视图并使用目标/动作机制执行动作一样简单。 如果我们想检测更多UIView的点击,我们会发现自己在重复: 手势的实例化 在视图中添加手势 选择器方法的实现,以及 方法实现内部的手势状态检查。 但是唯一不同的是: 哪个视图变得可以轻敲,以及 点击事件发生时执行的操作。 因此,在一个更好的世界中,做这样的事情就足够了: 或这个: 我们怎样才能做到这一点? 拟议的解决方案 我们将定义一个新的Tap类型,该类型将Tap-on-Action行为添加到视图:此类型的对象接收视图以及在Tap事件发生并连接它们时执行的动作。 基本的Tap类是: 手势动作的目标是这个新的Tap对象,因此另一个对象需要对其进行强有力的引用。 否则,它将被释放,手势事件发生时目标将为nil ,并且将不执行任何操作。 解决此问题的第一种方法是将Tap对象保留在视图上下文中(通常是UIViewController)。 这种方法不切实际,因为我们将需要为每个使我们可以Tap的视图保持每个Tap的引用,并且我们仍将重复没有意义的样板代码。 您可以在这个操场上看到这种方法。 保持引用与我们的点击操作无关,这是一个技术细节,一种更好的方法是让Tap类型处理引用保持,以保持界面整洁和易于使用。 怎么样? 使用创建Tap实例并将其保存在集合中的类方法。 像这样: 您可以在这个操场上看看这种方法。 Tap类将保留其实例,但应在释放其视图时释放它们的每个实例。 我们如何检测到这一点? 好吧,我认为一种非常简单的方法正在Tap和他的视图之间的引用,因此稍后,当我们找到带有nil视图的Tap对象时,可以释放它。 我们可以定期或每次创建新的Tap时触发此“清理”操作。 最终解决方案的完整代码可在此处获得,我们可以像这样使用它: 其他解决方案 使用继承:我们可以创建一个继承自UIView的TappableView类型。 该子类添加了onTapDo:方法。 添加手势target-action时,我们还将有一个私有方法用作选择器。 以这种方式进行操作,我们不是使UIView轻敲,而是创建一种新型的可轻敲的UIView :任何想要轻敲的视图都应继承自TappableView而不是原始UIView 。 如果我们要检测UILabel ( UIView子类)上的轻UIView ,则不能。 另外,我们使用继承来避免复制,这不是正确使用继承。 您可以在这个操场上看看这种方法。 使用协议扩展:我们可以定义一个协议可Tappable的协议,并使用UIView的默认实现的协议扩展,但是由于协议扩展不支持存储的属性,因此我们无法存储执行轻Tappable时要执行的块。 无论如何,一种解决方法是使用关联的对象在运行时向该对象添加新变量。 这种方法的缺点是,除了要用obj-c运行时接触UIView对象的内脏之外,当我们要使任何 UIView都可以被轻敲时,我们要使所有 UIView轻敲,而不是全部 。 我们可以扩展自定义视图类型的协议,而不是普通的旧UIView ,但是我们再次创建新的类型,而不是使任何UIView都可轻敲。 […]
作为我在阿姆斯特丹软件公司Oberon实习的一部分,我最近将iOS应用程序的业务逻辑从Objective-C重写为Swift。 该应用程序是My T-Mobile。 当时的Swift版本是3.0。 除了重写业务逻辑之外,我还写了一篇关于Swift的影响的研究论文。 从上下文来看,自Swift 2.0发行以来,Swift现在是iOS上Oberon的事实上的开发语言。 由于My T-Mobile应用程序是Oberon上运行时间最长的应用程序之一,因此用Objective-C编写的应用占80%。 Oberon认为,当应用程序在Swift上运行时,软件质量将会提高。 因此,我不得不重写业务逻辑,因为它是应用程序中使用最频繁的部分,但是在自然的开发过程中不太可能被重写为Swift。 定义软件质量 对于我的Swift影响研究论文,我需要定义软件质量。 我决定使用CISQ(IT软件质量联盟)模型。 CISQ的标准基于ISO标准,但更强调源代码,因为我正在使用和重写源代码,所以源代码与我的项目非常匹配。 CISQ模型着重于四个特征:可靠性,性能效率,安全性和可维护性。 我决定专注于模型的可维护性方面,因为Swift的功能和标准对软件质量的那些方面影响最大: 非结构化和重复的代码 高圈复杂度 文字的硬编码 组件尺寸过大 重复的业务逻辑 符合初始架构设计 架构层之间严格的调用层次 在本文中,我不会将重点放在这些点上,因为仅需一点上下文即可。 过程 因为懒惰的程序员是高效的程序员,所以我首先研究一下Objective-C-> Swift转换器。 有很多: https://objectivec2swift.com/ https://iswift.org/ https://github.com/dzenbot/XCSwiftr 但是,他们每个人都有问题。 前两个选项不是免费的,一次只能转换几十行。 最后一个不能与Xcode 8一起使用,因为Xcode不推荐使用插件。 即使使用转换后的代码,我始终觉得这是从Objective-C到Swift的直接转换。 例如,转换器永远无法以显示防护语句或让模式提供更安全代码的方式来转换Objective-C代码。 需要考虑的另一件事是,Swift和Objective-C具有不同的编码范例,因此,通过使用转换器,将无法实现这一目标,并且还必须以某种方式检查和更改代码更迅速。 对于我来说,听起来比从头开始还需要做更多的工作。 简而言之,我决定手动重写和重构应用程序,而不是使用工具。 作为一个没有这个项目经验的人,很难理解代码。 例如,当使用诸如NSArray或NSDictionary之类的类型时,旧的Objective-C代码更难于推断进入了哪种对象。 在重构过程中,我注意到,随着函数和属性的类型被显式声明,尤其是对于数组和字典,它们的功能和属性变得更加清晰。 另一个优点是,与使用Objective-C两文件副本相比,Swift的单一文件使在整个项目窗口中导航更加轻松。 在重构了整个业务逻辑之后,我不得不找出它对软件质量有什么样的影响。 由于本文是关于使用Swift的影响,因此我决定使用一个名为SonarQube的工具,这是一个开放源代码平台,用于检查代码质量。 初始结果如下所示: 如您所见,可维护性,安全性和可靠性是完全相同的。 Swift版本减少了1000行代码,并且减少了重复,但是这些差异并没有真正使人震惊。 因此,我对SonarQube的发现进行了更深入的研究。 我发现以下内容: 如果您忽略了新的代码味道-当您不更改代码时就不会得到新的代码味道-您会发现Swift版本的代码味道比其Objective-C的更少。 我研究了一下代码的味道,发现Swift版本完全没有一种代码味道:认知复杂性。 认知复杂性试图在某种程度上说明方法的控制流程难以理解,从而难以维持。 […]
我在WWDC 2017 作为我个人的背景故事,当时我在VWO 4中,至少可以说我度过了美好的一年。 自从我4岁开始学习以来,学校一直是我生活中的“问题”,而此时,我的“水桶即将溢出”。 我感觉不舒服,从字面上想起每天上学和变得不快乐的事实,我已经厌倦了。 让我前进的一件事是编程。 我于2015年开始进行iOS开发,几个月后发布了我的第一个应用程序,直到今天,我仍然每天都在学习新知识。 WWDC是我一生中最酷的一周之一,遇到了很多新人,他们都和我iOS开发一样感兴趣。 我开始感觉好些,但回到家后,我又回到了以前的“学校疾病”中。 在这一点上,我和父母决定放慢脚步。 我开始更多地待在家里,在那里我可以学习iOS开发并跟随我的热情。 然后,夏天来了,在暑假里,我盛开了,我再次感到高兴,得到了一份假期工作,赚了些钱,总之,一切都很好。 我以良好的希望开始了我的新学年(VWO 5),历时约2天。 两周之内,我在家比在学校多,一个月之内,我再也没有去学校了。 在这段时间里,我们与学校举行了多次关于“现在做什么”的会议,我再也不能去学校了,但是一直都呆在家里也不好。 长话短说,最后,我问是否可以作为iOS开发人员开始实习来扩展我的知识,而不仅仅是一直坐在家里。 学校对此还可以,我联系了该地区的几家公司。 其中之一就是wehkamp。 大约6个月后,即2017年12月,在几次会议之后,我正式开始在wehkamp担任iOS实习生,每周工作2天。 因为这是我想出的实习生,并且不是我的学业所必需的,所以我没有要完成的任务或要做的任务。 Wehkamp和我有完全的自由决定在那做什么。 由于其他方面的优先考虑而搁置了一段时间的项目是AR。 所以我们决定要做的是,我将开始使用AR来创建所谓的POC(概念证明)。 在wehkamp,我们拥有自己的生活产品系列,因此决定在AR中展示这些产品非常好。 确定了我们想要的东西之后,我就可以开始做/尝试事情了。 从简单地能够检测到表面开始,到从网络动态加载模型并重新映射纹理结束。 因此,让我们进一步深入。 开始时,我们必须弄清楚基本内容。 我有大约3天的ARKit使用经验,而这仅仅是超级基础。 我也几乎没有使用ARKits基础的SceneKit的经验。 因此,对于第一部分,我经常查看Apples文档和示例代码。 这样,我就能获得一个预加载的模型来旋转和移动,这在当时真是太神奇了! 转换次数 因此,对于我们的最终应用程序,我们需要的不仅仅是4个预加载模型,因此我们需要第三方参与为我们创建模型。 效果很好,但是我们遇到了一个问题。 这些文件以DAE文件(数字资产交换)的形式提供,这是一种流行的3d建模格式。 这里的问题是这些文件不适合移动设备,我们不得不将它们转换为SCN文件,SceneKit Node文件,这是Apple的格式,可与移动设备一起使用。 存储 我们的下一个障碍是模型的存储位置。 我们有了模型,现在我们需要将它们存储在某个地方,由于多种原因,将它们全部存储在设备上似乎不是一个好主意,最明显的一个就是存储空间。 因此,我们决定将它们在线存储,并且很好地解决了一个主要问题,我们将如何获取模型并将其显示在电话上? 为了解决这个问题,我们创建了一些功能,可以从服务器下载模型并进行渲染。 这花了一段时间才能弄清楚,但最终我们使它起作用。 然后,下一个问题出现了,或者实际上没有出现,这就是问题所在。 在将模型从DAE转换为SCN文件的过程中,所有纹理文件路径都被弄乱了,因此纹理将一直指向../现在指向我的Mac上的绝对位置。 在手机上渲染模型时,在该位置未找到任何内容,因为好吧,这不是我的Mac,因此该位置不存在。 我希望其他人也有这个问题,所以我可以将粘贴复制到解决方案中并完成。 但是事实并非如此……所以我们最终要做的是编写一个自定义的重映射函数,该函数将每个纹理文件从其怪异的URL映射到设备上的正确URL。 灯光 所以现在我们在房间里有了一个带纹理的3D模型,可以移动它,但是仍然有一些问题。 首先,一切看起来都像是一个充气的,反光的塑料模型。 简而言之,它们很丑! […]
上周,HackDavis与DCSC合作举办了一个研讨会,重点是如何在Xcode中构建简单的iOS应用。 以下是由DCSC自己的Andrew Cope主持的研讨会的一般主题的摘要。 为什么选择iOS? iOS是由Apple创建的,并且存在于名为Xcode的IDE的开发环境中。 苹果还创建了自己的语言,称为Swift。 通过在Apple App Store上拥有约220万个应用程序,您也可以通过创建第一个iOS应用程序而成为专业的Apple开发人员! 安德鲁在其上进行演示的应用程序名为“您是否在做人吗?”,该应用程序可让您输入文本并确定用户是否在做人手(这是通过在开始时使用“实际”一词来确定的)输入)。 以下是研讨会期间他的演示的概述: 使用者介面(UI) 构建应用程序的第一步是使用UIKit(Apple的UI框架)设置基本的UI。 组成Xcode中的UI的一些基本组件: 屏幕:UIViewController 基本矩形:UIView 带有文本的矩形:UILabel 可以点击的矩形:UIButton HTTP请求 一旦使用输入框和周围的文本设置了基本UI,Andrew就说明了HTTP请求从服务器获取数据并将其返回到界面的重要性。 这是两种形式的请求: GET:给定特定的URL,服务器可以发送响应。 POST:给定特定的URL(以及要上传的内容),服务器可以发送响应。 在Swift内,有许多用于HTTP请求的框架,用于设置项目的框架是Alamofire和SwiftyJSON。 例如,安德鲁的演示中使用以下代码来使用Alamofire发出HTTP请求以收集数据。 该函数接收一个字符串(输入文本),将HTTP请求发送到服务器。 当请求获得响应时,它以JSON(JavaScript对象表示法)对象的形式返回。 然后,将一个名为“结果”的变量分配给isMansplaining的值,该变量是一个布尔值(真/假值),用于确定文本是否被认为是假人。 如果确定该文本是假冒的,则应用标签会显示文本“是。 :(“。否则,它显示:“ YOU’RE GOOD。:)” 如您所见,在iOS中创建应用程序非常用户友好,因此绝对不要吓倒它。 仅使用基本的Google搜索功能,您就可以从基本应用程序开始使用,然后发展为“您主要吗?”之类的东西。 可能性无穷无尽,希望您今天就可以开始构建有用而古怪的应用程序! 资源资源 安德鲁特科普(Arew-You-Mansplaining) Are-You-Mansplaining –具有服务器组件 github.com的简单iOS应用 HackDavis iOS工作坊 iOS HackDavis Workshop Series docs.google.com简介 斯威夫特–雷·温德利奇 Swift是Apple用于可可开发的新的,现代的,类型安全的编程语言。 如果您想学习制作方法,请访问www.raywenderlich.com 使用Swift开发iOS 10应用– Stanford在iTunes U上的免费课程 使用Swift,斯坦福大学,计算机科学,iTunes […]
您是否听说过面向对象编程? 是的,当然。 OOP在当今非常普遍。 但是,面向协议的编程呢? 面向协议的编程(POP)最早由Apple在WWDC 2015中使用Swift 2.0引入,他们称Swift为POP,而不是像其他通用语言一样是OOP:Java,Python,C#等。 您可能会想:POP到底是什么? 1.什么是POP? 实际上,我们没有任何官方文档来定义POP,但是可以。 让我们仔细看看它的命名并进行比较:面向协议的编程与面向对象的编程。 显然,它们与“前缀:对象和协议”有很小的区别。 现在,尝试想象和思考面向对象的编程:这是什么? 我们为什么称其为OOP? 在OOP中,我们设计并关注“类”及其实例(称为“对象”),该实例可能包含数据,属性,方法,实现等。 →在面向对象编程中,我们专注于对象。 →我们可以推断:面向协议的编程,我们将尝试使用协议。 “而不是使用类,而是从协议开始” 2. POP的一个例子? 因为POP替代了OOP,所以POP具有比OOP更大的优势。 如今,在Swift中,我看到人们更喜欢将Struct与Protocol结合使用(通常在POP中使用),而不是使用Class(OOP)。 Class可以做的一切,Struct也可以,Struct基于Value Type而不是Class中的Reference Type→我们可以避免内存泄漏,隐式共享数据,死锁(多线程)等等。 不仅仅是POP和OOP,我们将举一个实际的例子。 我有一个叫做Bird的类,Bird具有2个属性:name和feather。 现在如何解决? 在OOP中: 分离到:鸟类和企鹅班→糟糕,不好的主意。 为Flyable创建协议说明→我们必须重新编写许多代码 更改为static func fly()→如果我们有10–100个子类? 3.欢迎使用POP: 我们可以重新设计我们的基本代码,从类更改为协议和结构以解决此问题。 您可以尝试添加新鸟,例如鸵鸟(不能飞行,但鸵鸟有羽毛),然后看看魔术。 结束语,我希望通过我的样本,对面向协议的编程有一个聪明的了解。 当然,POP只是一个概念,您可以根据自己的决定和问题来应用它,也可以根据需要决定是否应用它。 如果您想了解更多有关此主题的信息,则有一些很好的链接: 苹果官方链接 POP是个美丽的故事 相反的想法 实际应用
移动分析事件故事 背景故事 最近,我的一名营销部门同事来到我们的团队,他说他想在我们的iOS应用程序中添加另一种激动人心的分析事件,即产品列表印象。 我不得不承认,我们喜欢将整个营销团队作为一个整体来实施,他们不喜欢编写大量垃圾代码,而只是在几乎每个sprint中添加新的分析事件,而不是为用户创建令人兴奋的新功能。 那么,首先,“印象”事件是什么意思? 基本上,这意味着 用户看到内容时发生的事件。 从应用程序发送事件是一件容易的事(至少在大多数情况下是这样),但是从工作描述中获得的一小部分信息提到此类事件可能存在挑战。 当用户完全看到单元格的内容时,它将视为印象,并且可以通过事件包装器发送它。 但是,如果用户看到的内容不到单元格内容的一半,则不应将其视为展示,并且在这种情况下不应发送任何事件。 除此限制外,还有其他规则要注意。 为了清楚起见,让我们定义以下规则, 用户应看到一个单元格的一半以上,以将该事件计为印象 即使用户再次看到这些单元格,已经发送的事件也不应再次发送。 不幸的是,UICollectionView没有提供任何方法或回调可在这种情况下直接使用。 因此,让我们编写一个印象事件处理程序,以检测用户看到了哪些单元格,以算作印象。 ✌️ 编码部分 首先,让我们创建处理程序类,我将其命名为ListingImpressionStalker (是的,实际上,该命名定义了它的实际作用),并使用基本的初始化程序和公共方法定义了两个变量。 第一步 minimumPercentageOfCell是我们的比率约束,与用户查看以计数作为印象的单元格的可见部分的最小百分比有关, collectionView只是对事件进行跟踪的弱collectionView参考。 让我们开始为stalkCells()方法编写一些代码。 首先,我们需要当前对用户可见的单元格。 对于我们的露西来说,UICollectionView有一个名为visibleCells()的方法,该方法返回当前可见的可见单元实例。 我们应该通过调用此方法来获取这些单元格,然后应通过迭代对每个单元格进行可视区域计算的百分比。 让我们将它们放入代码中 一种计算单元格内容可见部分百分比的方法 这种方法遵循的步骤非常简单, 使用Guard语句为单元安全地创建局部变量indexPath和layoutAttributes。 在超级视图中找到单元格的真实位置。 使用collectionView的框架和superview中的单元格的框架计算交点rect,该框架在上一行计算得出。 计算交集的百分比并将其返回。 而已。 由于我们知道相关单元格的已查看区域的百分比,因此可以确定此视图是否应计为印象事件,这取决于此方法的返回值。 让我们创建一个协议来发送使用委托模式找到的索引路径。 ListingImpressionStalkerDelegate协议定义 使用此协议的sendEventForCell(atIndexPath indexPath:Indexpath)方法,我们可以将索引路径发送到符合ListingImpressionStalkerDelegate的类。 我们已经迭代了可见的单元格,并且每个单元格的视图百分比计算已经完成。 在需求方面,还有最后一件事,让我们记住我们的第二条规则, 如果用户再次看到这些单元格,则已经发送的事件不应再发送。 为此,我们可以轻松地创建一个数组来存储已经发送的索引路径。 够了吗? 也许是大多数时候,是的。 但是,我们应该使其尽可能灵活,以涵盖许多情况。 为了让用户选择该选项,我们创建一个名为ListingImpressionItem的协议。 ListingImpressionItem协议定义 属于我们跟踪的集合视图的单元格应遵循此协议以提供唯一的标识符。 现在,我们可以存储这些唯一的ID而不是索引路径,以防止再次发送新事件。 定义了ListingImpressionStalkerDelegate和ListingImpressionItem协议之后,我们可以按如下所示完成stalkCells()方法, stalkCells()方法的主要部分 最后的话 在故事的最后,我们完成了简单的印象事件处理程序。 […]
在开始学习Swift的过程中,您首先要注意的主要事情之一是Swift和Ruby之间的类型系统之间的差异。 清楚地了解这些差异将帮助您更好地了解如何编写Swift以及为什么我们必须做一些不同的事情。 差异:动态类型与静态类型 如果您是Ruby开发人员,那么您将生活在一个动态类型的世界中,可以自由地编写表达性代码,而不必指定变量将包含的对象类型或方法将作为参数接受的对象类型。 在设计接口时,您可能不习惯于类型方面的考虑。 这是因为Ruby并不真正在乎对象的类型 ,只要它们响应发送给他们的方法(或消息)即可。 从技术上讲,对象的类型是由其消息定义的,而不是由对象的类定义的。 动态类型化意味着事物的类型可以在程序过程中进行更改,因为在使用事物之前不会确定类型。 例如,这允许我们将变量定义为字符串,然后将该变量重新定义为任何其他类型的对象。 例: my_variable =“这是我的字符串” =>“这是我的琴弦” my_variable = SomeClass.new =># 另一方面,Swift是一种静态类型的语言。 这意味着我们必须在代码中声明对象的类型 ,以便编译器在编译程序时可以使用这些类型声明来检查类型错误。 但是,在Swift中,如果您为变量设置初始值,则不必显式声明对象的类型。 然后,编译器将在编译时推断对象的类型(稍后将对此进行更多介绍)。 在这里,事物的类型必须在设计软件时确定,而不是像Ruby那样在运行时确定。 这意味着,一旦声明了类型,就无法再更改。 例: var myVariable =“这是我的字符串” =>“这是我的琴弦” myVariable = 123 =>错误:无法将类型“ Int”的值分配给类型“ String” 差异:类型安全 类型安全性是指编程语言强制执行可以对某些类型执行的操作的程度。 如果一种语言可以执行的唯一操作是该类型可以接受的操作,则该语言是类型安全的。 Swift是一种类型安全的语言,而Ruby不是。 在类型安全的语言中,您必须清楚代码可以使用的值的类型。 例如,您必须清楚变量将包含的对象类型或方法将用作参数的对象的类型。 您还必须清楚方法将返回的对象类型。 因此,如果将变量声明为String类型,则以后不能将其更改为Integer。 如果某个方法希望接收Float类型的参数,则不能传入Double类型的参数。 如果尝试这样做,编译器将捕获这些类型不匹配的内容并将其标记为错误。 在Ruby中,您无需声明变量将包含的对象类型,方法将接受的对象类型或方法将返回的对象类型。 如前所述,Ruby并不真正在乎对象的类型 ,只要它响应发送给它的消息即可。 在这里,对象是由它们的消息定义的,而不必由它们的类型定义。 每个类都定义一个合同,它是公共接口。 以这种方式考虑,可以对类执行的唯一操作是属于其公共接口的那些操作。 但是与Swift这样的类型安全语言不同,我们不必明确说明代码可以使用的值的类型。 相似之处:强类型和类型推断 这些语言要注意的两件事是它们都是强类型语言,并且使用类型推断来推断对象的类型,因此我们不必显式声明它。 […]