Tag: iOS应用开发

健康日记1:更好的HealthKit API

这将是我在我的应用程序Health Up Display上进行的一系列工作中的第一步。 我从社区中的其他开发人员那里汲取了灵感,这些开发人员已经针对自己的应用做了类似的博客。 请查看Brent Simmon的旧版Vesper Sync日记或Curtis Herbert撰写的Slopes Diaries,以获取一些示例。 启动此系列文章有一些目标。 当我通过这些事情进行推理时,一种与自己大声交谈的方法。 可能从已经解决类​​似问题的其他人那里寻求帮助。 在学习过程中,向我后面的其他人提供相同的帮助。 使用公众责任感作为脚下的火,以提供保持专注并最终发布此应用所需的动力。 在我仍将脚趾浸入博客水域时,请提供稳定的内容。 在开始之前,请先了解一下背景知识。 可惜的是,Health Up Display是我几年来一直在从事的健康和健身跟踪应用程序。 我想要一个将Health.app的数据库查看方面与iOS上Activity.app中的UI更相似的设计样式相结合的应用程序。 我还想解决我认为这两个应用程序都存在的缺点。 我喜欢将此应用程序视为这两个应用程序(如果有孩子)的产品。 我在该项目上的进展还没有达到我想要的水平,但是尽管如此,我还是取得了进展,如果您想看看的话,可以使用一个非常有用的beta。 您可以在这里注册尝试一下。 顺便说一句,我们可以继续讨论今天的日记条目。 与HealthKit进行交互的更好的API 正如我提到的,我已经在这个项目上工作了一段时间。 有些代码确实很旧。 就像旧的Swift 2.0。 另外,我只是在学习Swift,而实际上大部分只是用Swift编写的Objective-C代码。 这在一定程度上是我的错,因为我还没有熟悉这种语言,并且在那时,它的风格仍在迅速发展。 这也部分是由于这样的事实,即系统框架尚未(在许多情况下仍未真正为Swift进行过现代化)。 对于HealthKit框架尤其如此。 从好的方面来说,这是一个非常使用闭包的框架,并且在这方面非常适合Swift,但是这些闭包实际上是旧的Objective-C块。 实际上,大多数HealthKit API是使用闭包来异步处理其结果的查询。 不幸的是,在大多数情况下,这些闭包通常具有用于可选的有效查询结果和同时可选的错误的参数。 大多数Swift开发人员并不真的喜欢那样,我们也不认为它非常迅速 。 我们更喜欢使用可靠的Result类型之类的东西,以简单的switch语句清楚地区分成功还是失败。 如果您需要查看内容,请阅读这篇文章。 我的应用程序具有一些旨在为我构建这些查询的类。 它们还为我的应用程序与HealthKit交互提供了一个集中的位置和包装器。 我使用这些实例从HealthKit数据库检索运行状况统计信息,然后将它们存储在我的应用程序自己的数据缓存中,以便UI可以在启动后立即准备好您的最新统计信息。 您确实不需要每次启动应用程序时都等待查询返回。 当查询最终在以后返回较新的数据时,我将更新缓存和应用程序的UI层。 这些类充满了前面提到的并非Swifty的代码实例,而且由于我对Swift风格的了解以及对如何使用HealthKit以及与HealthKit交互的知识越来越多,现在也HealthKit 。 另外,我希望很快就可以开始使用该应用程序的Apple Watch组件,并且我还需要与该目标共享大量此类代码。 我还有一个有趣的宠物项目应用程序,名为Mowing Meter,它使用iPhone的运动协处理器芯片在修剪院子时跟踪您的步距和距离。 我目前正在将其转换为Swift,并将其也转换为“ 真正的 […]

从Pod导入Objective C标头? 十分简单!

我是一名新的iOS程序员。 我距Swift已有3年了,所以我在iOS编程中的第一门语言是Swift。 尽管那里有很多库可以帮助我开发应用程序,但它不像Swift库那么简单,Swift库仅在“ pod安装”完成后无缝地导入其模块。 为了更清晰,在这里我谈论的是如何从通过Cocoapods注入的库中导入Objective C标头。 轻松将库手动注入到Swift项目中。 您可以将其文件从外部文件夹拖放到您的项目中,Xcode将为您提供为您生成Objective C桥接标头的选项。 或者,您可以创建一个新的Objective C头文件“ .h”,并将其命名为: -Bridging-Header.h 在我们开始之前,我想使它成为一个简单的教程,而不仅仅是有经验的程序员记住某些东西的方式。 这意味着,虽然实现起来很短,但是one line code ,但是我想分享一下我如何通过反复试验来理解这一点。 因此,像往常一样,让我们​​创建一个新的Xcode项目。 随意命名,忽略核心数据,UI测试和单元测试。 就像您每天一样,如果您每天制作一个新应用程序。 然后,我需要您至少知道如何使用Cocoapod。 如果您不知道Cocoapod是什么,那么花一点时间来了解iOS开发者社区为我们提供的如此出色的工具。 您将要访问其官方网站,该网站还提供了我们找到所需图书馆的方式。 前往http://cocoapods.org 新,我想您已经掌握了Cocoapod。 然后,我们将使我们的项目使用将从Cocoapod获取的外部库。 转到项目根文件夹,如果您不知道什么是根文件夹,则只需转到包含我们的。xcodeproj文件的文件夹。 在终端上运行pod init 。 Podfile Pod完成后,让我们打开Podfile声明要导入的Pod库。 让我们找到一个仅用Objective C编写的好的库。我的意思是,这个库在Swift中还没有或者没有。 我们有MagicalRecord,它将帮助我们管理CoreData的使用。 通过将pod ‘MagicalRecord’,’~> 2.3’放在…行的#Pods下pod ‘MagicalRecord’,’~> 2.3’将MagicalRecord声明为Podfile。 保存Podfile,然后在终端上运行pod install 。 我们将获得由pod发送的一堆日志,以告知我们项目中的当前操作。 等到完成。 现在,我们在根文件夹中具有。xcworkspace和.xcodeproj。 如果我们使用Cocoapod作为第三个库管理器,则每次处理项目时都希望使用.xcworkspace。 如果您想替代Cocoapod,我们可以选择Carthage和Swift Package Manager。 打开.xcworkspace。 我们的项目保持不变,只不过我们在Xcode导航器窗格中注册了两个项目。 一个是我们自己的项目,第二个是Pod项目。 这就是为什么我们需要使用xcworkspace来始终加载Pod项目的原因。 […]

经验丰富的程序员参加编码训练营的5个原因

DevMountain培训了很多业余或新手编码人员,这些人员以前很少或没有经验,但是我们也有一些学生已经知道如何编写编码。如果您是一位经验丰富的程序员,那么您可能对回校没有太多的考虑。 我们将解释为什么我们的资深学生会在这里,以及如何学习现代技术技能比您想象的要容易。 1.编码训练营更新您的技能 技术世界飞速发展,如果您不时重新访问自己的技能,那么您可能会落在后面。 DevMountain编码新手训练营使您可以从了解您现在需要了解的现实世界的专业人员那里学习最新的语言和软件。 在我们的网站上查看我们的课程选项,发现从编码新手训练营中学到的新技能! 2.加快了编码训练营的速度/快节奏 作为编码员,程序员或企业家,您不能花时间学习新技能。 DevMountain的新手训练营可让您快速获得所需的培训和信息,并提供全职或兼职学习的选项。 它比回到学校更快,比自学更快。 在DevMountain,我们知道您的时间很宝贵,并且您的日程安排可能很忙,因此无论您的情况如何,我们都会尽一切努力使我们的课程尽可能地易于访问。 3.编码训练营可帮助您建立连接 如果您已经有一段时间了,那么您可能已经知道拥有正确连接的重要性。 我们的新手训练营计划为您提供了与编码专家以及新锐编码员并肩工作的机会。 您还将有机会参加我们的许多活动和会议。 4.给您的简历认真的改头换面 恢复看起来有些乏味吗? 在这里,在DevMountain,我们作为该国评分最高的编码学校之一而享有盛誉,这使其成为任何工作申请中令人印象深刻的补充。 同样,与我们的专家团队紧密合作将确保您离开训练营并获得出色的参考。 5.重新发现您对编码的热情 DevMountain是在您选择的职业道路上寻找新灵感的理想场所。 我们营造一种创造力和发现力的环境,您将被志趣相投的志同道合的人所包围。 这样的专用空间帮助许多学生点燃了对职业的热情。 不过,请不要相信我们的话-在我们的推荐页面上听听我们的学生对我们课程的喜爱。 你还在等什么? 我们拥有您升级简历并将职业提升到新水平所需的一切。 您将能够获得在当今市场上所需的技能,快速获取它们,并在使用过程中建立新的联系。 这是您宝贵的机会,可以充分利用您的时间和教育。 索取课程提纲,以了解您将在DevMountain学习的内容。 您甚至可以与我们的团队见面,并查看他们的证书。 我们迫不及待想要帮助您取得更多成就并继续发展您的事业。

使用CocoaPods托管内部私有框架

当您拥有需要在公司内部的iOS开发人员之间共享而无需公开的框架时,可以使用私有的CocoaPods存储库来实现。 在这篇博客文章中,我将逐步向您展示如何做到这一点。 您应该已经安装了CocoaPods,否则请安装它: 须藤宝石安装cocoapods 在公司的Github,Bitbucket或Gitlab上创建私有存储库: 2.提供所有iOS团队成员的访问权限。 3.添加您的私人规格: pod repo add specsName https://code.company.com/podspecs.git 注意 :它将添加到通行证~/.cocoapods/repos 4.准备好吊舱后,将CocoaPod规格推到远程位置: pod repo push specsName MyPod.podspec 要么 pod repo push –allow-warnings specsName MyPod.podspec 5.当您需要使用内部Pod时,只需将您的私有podspecs源和期望Pod添加到Podfile中: source ‘https://code.company.com/podspecs.git’ source ‘https://github.com/CocoaPods/Specs.git’ platform :ios, ‘11.0’ target ‘MayApp’ do use_frameworks! pod ‘MyPod’ end

iOS App开发趋势将在2018年遵循 红字节

有趣的是,要注意的是,全球知名的Apple在2017年已销售超过1.3亿部iPhone。这一惊人数字表明,全球iPhone爱好者日益普及。 因此,明智的做法是让所有iOS应用程序开发人员了解他们有望在2018年底出现的最新趋势。作为iOS应用程序开发公司的一部分,您可以查看以下内容描述的趋势设置元素有望通过有前途的最新iOS应用程序在iOS应用程序开发中引起涟漪。 1. AR和VR-iOS领域的有希望的流行语 作为一个完善的iOS应用程序开发人员,增强现实和虚拟现实似乎已成为日常工作。 随着iOS 11及其版本的推出,许多很棒的AR应用程序当前正在激发iPhone爱好者的视觉感觉。 在VR和AR领域开辟了许多机遇,Apple产品及其AR Kit一直是这个城市的话题。 最新版本的Apple手机由增强现实查看器提供支持,支持VR功能,使您可以轻松进入任何模拟环境。 您可以使用手机或VR耳机享受梦you以求的世界的真实体验,而您一直希望成为其中的一部分。 2.物联网 苹果于2017年推出iOS 11,为物联网开辟了新途径,这一趋势预计还将持续到2018年。 iPhone解决了与IoT设备与智能手机的连接性相关的急需的安全性问题,已稳步成为可用于未来的设备。 鉴于以安全为中心的系统在我们的日常交易中占据着举足轻重的地位,iOS应用程序开发将释放已成为我们日常工作中不可或缺的一部分的联网解决方案的潜力已经不远了。 因此,iOS应用程序开发人员需要一个小时才能跟上这一趋势,这将使与IoT系统安全性相关的许多粗糙问题变得平滑。 3.基于云的技术的普及 当您的应用程序与基于云的技术集成时,您将被添加到新的风格中。 鉴于iPhone上基于云的应用程序需要较少的存储空间,因此您将处于有利的地位,可以在不耗尽内部内存的情况下改善智能手机的存储空间。 这自然会给智能手机用户带来祝福,他们将依靠以云为中心的技术来安装和使用应用程序。 2018年的iPhone爱好者可以充分利用Apple iCloud上可用的免费云存储应用程序,该应用程序可以将您的照片和照片备份1个月。 4. iOS企业应用程序的创新功能 根据统计数据,到2018年初,预计将有超过50%的美国公司投资于10多种专用应用程序。这一趋势为需要抓住一切机遇的iOS应用程序开发人员打开了许多大门。 企业应用程序开发的日益普及将释放iOS应用程序开发公司的潜力。 预计到2018年,iOS应用程序开发人员将结合敏捷管理指南,为企业提供对CRM功能控制的帮助。 您还可以期望企业经理使用由决策驱动的企业应用程序,这些应用程序将无缝管理大量任务和流程。 数据分析是使这些管理人员能够显示通过键入实时智能数据点而获得的大量结果的工具。 5. iOS应用程序开发人员的多学科范围 鉴于与iOS应用程序开发相关的众多好处,iOS应用程序开发人员将处于有利位置,可以充分利用推动大数据,企业应用程序开发和IoT的原则.iOS应用程序开发人员的这种多学科范围得以实现众多创新功能将以超出您想象的方式吸引用户。 6.不成文的安全承诺 包括苹果在内的所有技术领域的巨头都在努力保护其移动数据免受安全威胁。 鉴于影响全球公司业绩的紧迫担忧,苹果介入提供了与最新数据安全要求同步的应用程序开发平台。 因此,2018年将实施创新和前沿的数据加密实践。 因此,这种趋势将使iOS应用程序开发人员将安全性作为其移动应用程序的核心要素。 7.以GPS为中心的服务将占据主导地位 引用您从未听说过与GPS结合的创新AR技术推动了PokémonGo游戏的普及,这将是一个夸大的说法。 通过此游戏,iOS应用程序开发人员完美地融合了AR和GPS的功能,为出现更多的创新创造了空间。 到2018年,您将见证值得称赞的结果,这些结果将以导航功能和位置跟踪功能的形式浮出水面,这些功能使手机成为万能的设备,可帮助在自动化和零售领域运营的公司充分利用GPS驱动的iPhone应用程序。 8. Swift 3.0排名苹果无可争议的本地编程语言 正是在2015年12月,Apple向技术专家发布了其专有的Swift开源。 从那时起,就再也没有想到Swift会在2016年推出一个名为Swift 3.0的更新版本。iOS应用程序开发人员可以轻松使用这种编程语言,从而可以生产出适用于iOS,watchOS和tvOS的应用程序。 这可以看作是在开发iPhone应用程序中使用高级编程语言的重要一步。 9.有利于移动交易和支付的积极因素 电子商务门户网站已经以方便易用的付款方式逐步取代了平凡的实体店。 与传统的卡支付和现金支付相比,移动支付已成为普及交易的最安全,最快的手段。 已经提出Apple Pay作为其高效的移动支付网关的Apple也有望在2018年吸引所有iPhone爱好者的关注。 10.延迟加载页面的完美解决方案 […]

使用Unity 3D和Vuforia的增强现实应用程序

每个人都想像并拥有自己的独到见解。有价值的想法是创造力。将您的想象力投入工作会在现实世界中产生非凡的输出。我相信增强现实 (AR)是IT技术中最好的创造力之一。 Unity 3D是一个游戏开发引擎,将使我们能够构建增强现实(AR)应用程序。它是构建AR应用程序的神奇且绝对出色的游戏引擎,我们将使用高通公司拥有的Vuforia的SDK。伙计们做了一些非常出色的工作,可以帮助他们快速,轻松地创建AR游戏。如果您以前从未使用过这些工具,以下是一些有用的链接。 学习Unity 刚开始? 准备提升您的职业生涯或提高团队技能? Unity具有广泛的资源,可用于… unity3d.com 入门 ©2011-2018 PTC Inc.保留所有权利。 这些材料中没有任何内容可以出售任何组件或… lib.vuforia.com 我已经使用统一的3D和Vuforia完成了简单的iOS应用。 看一看 ! 做完!!!! 现在我们准备开始我们的项目。将这两个资产合并到您的统一项目中。只需双击软件包并导入。那里的一些很棒的人只需几个简单的步骤就可以使开发人员很容易地完成此过程。谢谢! 现在,我们需要将3D模型放置在目标上.Unity本身拥有资产商店,您可以在其中搜索特定模型并下载。我使用了“ Fantasy Monster ‘,这是免费的3D图像资产,您可以使用任何想要放置的东西如果需要其他3D模型,例如“ Pokemon ”,则可以使用“ Root of evil Studios- http://roestudios.co.uk/ ”网站进行下载, 并将其添加到Project Asset文件夹中。 unity项目如下所示: 让我们统一配置相机。在Assets搜索栏中搜索ARCamera并将其放置在场景中。转到检查器选项卡中的App许可证密钥,然后粘贴从Vuforia Project复制的许可证密钥。搜索ImageTarget并将其放置在场景。转到“图像目标行为”,然后选择您先前在Vuforia项目上创建的数据库和ImageTarget。 您可以根据自己的需要来玩诸如“位置”,“旋转”和“缩放”之类的变换。现在我们可以在目标上看到我们的图像了。 选择您选择的任何图像并将其添加到场景中,通过拖动将其放置在任何位置。主要是3D模型(口袋妖怪)具有ImageTarget的子对象 (嵌套在内部),否则可能无法正常工作。另一个提示:如果您发现Image Target是白板而不是图像,请搜索ImageTarget Texture并将Texture Shape更改为2D。 而已 !! 在设备上实际运行之前,您可以在unity编辑器中运行并检查其运行是否完全符合您的预期。它会自动生成一个Xcode项目。由于iOS应用在设备上运行时需要临时配置文件,因此我建议先构建并在xcode中运行。 通过相同的过程,该项目也可以为Android设备构建。 保持联系以获取更多应用程序。 我的下一个应用程序是使用Makehuman和Unity 3D来使用类人动物。Unity3D中有很多功能。 创建自己的游乐场并开始游戏。

快速了解所有属性

首先,让我谈谈property 。 假设如果我们需要使用您的类的对象来更改或访问您的类中的iVar,则应该为该iVar分配getter和setter方法。 主要在其他对象需要更改或访问对象中的ivars时使用属性,而无需手动定义getter和setter或使用@property(在目标– c中)。 在Objective-c中, @property property在类标头中声明一个属性。 这是一个例子: @property (nonatomic, retain) NSString *myString; @synthesize为属性(访问器方法)创建setter和getter。 如果不进行synthesize ,则必须编写自己的setter和getter实现,例如getMyString或setMyString(将属性的第一个字符大写)。 因此,以上属性声明等效于: – (NSString*)myString {} – (void)setMyString:(NSString*)newValue {} 属性可以进一步分为存储属性和计算属性 。 存储属性与计算属性 存储的属性将常量和变量值存储为实例的一部分,而计算的属性将计算(而不是存储)值。 ►计算的属性由 类 , 结构 和 枚举提供 。 ►存储的属性仅由 类 和 结构提供 。 最简单的形式是,存储的属性是作为特定类或结构的实例的一部分存储的常量或变量。 存储属性可以是变量存储属性 (由var关键字引入)或常量存储属性 (由let关键字引入)。 下面的示例定义了一个称为FixedLengthRange的结构,该结构描述了一个整数范围,该整数范围的长度一旦创建便无法更改: struct FixedLengthRange { var firstValue: Int let length: Int } […]

Firebase电子邮件链接身份验证

Firebase提供了很棒的api来管理应用程序的后端。 今天,我们将在iOS App中实现Firebase电子邮件链接身份验证功能。 在我们开始之前,没有多少关于此功能的信息。 当用户点击该链接时,您可以发送电子邮件验证链接,它将用户重定向到应用,然后用户可以使用EMAIL和LINK登录。 注意:这是少密码登录。 您可以按照以下Firebase文档中的功能进行操作: 我将描述实现iOS应用程序此功能的所有必要步骤,请按照以下指南进行操作: 注意:为此功能,必须在 App Store Connect 上创建iOS应用 程序, 因为Firebase在创建动态链接时需要App Store ID和Team ID。 我不会介绍如何使用Firebase文档设置iOS App的出色表现。 完成设置后,安装Pod’Firebase / Auth’。 通过转到Firebase控制台“身份验证”选项卡,从顶部选择“登录方法”,以启用电子邮件链接(无密码)登录。 这是此功能的核心部分,请按照以下每个步骤仔细实施: 转到您的项目Firebase控制台,打开“动态链接”选项卡。 添加您的域,主要是Firebase建议的域名。 创建新的动态链接并设置短URL链接: 现在设置动态链接,复制您的授权域并粘贴在深层链接URL字段中。 授权域路径:Firebase控制台>身份验证>登录方法>向下滚动。 定义iOS链接行为,选择“在iOS应用中打开深层链接”,然后从下拉列表中选择应用捆绑包ID: 现在不需要4和5了,都按下一步创建它。 现在,我们必须在Xcode项目功能和信息选项卡中做两件事。 首先复制“动态链接域”,然后转到“ Xcode功能”选项卡,在“关联域”中创建一个并编写应用链接:并粘贴您的域。 其次,我们必须创建一个URL方案,打开Xcode Info选项卡并展开URL Types创建一个副本,然后将您的iOS App bundle标识符粘贴到URL Schemes字段中。 确保从下拉列表中选择“编辑者”角色,然后根据需要命名该标识符。 现在您已经准备好了,在继续进行编码之前,让我向您展示App UI,以便您了解功能和代码的工作方式。 我已经创建了用于输入电子邮件的简单文本字段和两个按钮,即“发送链接”按钮(用于向用户发送电子邮件)和“登录”按钮(用于在验证后使用电子邮件登录)。 您可以根据自己的需求自定义它。我已经创建了一个演示来实现此Firebase功能。 我希望你已经 在iOS应用和Pod’Firebase / Auth’中设置Firebase。 当用户单击“发送链接”按钮时,我们将通过调用firebase Auth.auth.SendSignInLink Api函数将身份验证链接发送到用户的电子邮件,该函数接受电子邮件和Parameters中的ActionCodeSetting。 ActionCodeSetting向Firebase提供有关如何构造电子邮件链接的说明。 下面是“发送链接”按钮操作的代码片段: […]

Swift World:设计模式-适配器

我们已经完成了创建模式,并将在本文中介绍结构模式。 从字面上看,结构模式与结构有关。 这意味着如何组织类或实例以形成更大的结构。 我们首先要讨论的是适配器模式。 现实世界中最新的适配器示例是闪电式3.5毫米耳机插孔适配器。 如果我们想在使用防雷连接器的新iPhone 7中重复使用旧耳机,则需要使用此适配器进行连接。 显然,耳机插孔适配器是适配器。 旧的3.5毫米耳机是适配器。 在编程世界中,适配器是我们要重用的老类。 但是其接口与新接口不兼容。 因此,我们需要一个适配器来帮助他们。 我们可以通过两种方式实现适配器模式。 第一个是使用合成的对象适配器。 适配器中有一个Adaptee实例来完成这项工作,如下图和代码告诉我们。 protocol Target { func request () } class Adapter : Target { var adaptee: Adaptee init (adaptee: Adaptee ) { self. adaptee = adaptee } func request () { adaptee .specificRequest () } } class Adaptee { func specificRequest () […]

iOS面试问题(快速)-第1部分

Swift的优点是什么? Swift是Apple Inc.为iOS ,macOS,watchOS,tvOS和Linux开发的通用,多范式, 编译时编程语言。 可读性 -简洁的语法,使阅读和编写变得更加容易。 维护 -更少的代码和更少的旧版-一个文件.swift。 更安全的平台 -您可以在编写代码时编译并修复错误。 高速 —令人难以置信的快速,高性能的LLVM编译器将Swift代码转换为优化的本机代码,以充分利用其设备。 还对语法和标准库进行了调整,以使代码发挥最佳性能。 Swift支持动态库 开源的 2.解释类和结构之间的差异。 快速的类和结构之间主要有四个区别。 类具有以下结构没有的其他功能: 类型转换 :类型转换使您可以在运行时检查和解释类实例的类型。 引用计数允许对一个类实例进行多个引用。 (结构是值类型,类是引用类型。) 继承使一个类可以继承另一个类的特征。 使用反初始化程序 ,类的实例可以释放其分配的所有资源。 结构在您的代码中传递时总是被复制,并且不使用引用计数。 结构实例总是按值传递,而类实例总是按引用传递。 3.何时使用类和何时使用struct? 作为一般准则,请考虑在以下一个或多个条件适用时创建结构: 该结构的主要目的是封装一些相对简单的数据值。 合理的是,当您分配或传递该结构的实例时,将封装的值复制而不是引用 。 结构存储的任何属性本身都是值类型,也应该期望将其复制而不是引用。 该结构不需要从另一个现有类型继承属性或行为 。 在所有其他情况下,定义一个类,并创建该类的实例以通过引用进行管理和传递。 4.如何传递变量作为参考? 我们可以使用inout参数将变量作为参考传递。 inout表示修改局部变量也将修改传入的参数。 var值:字串=“ Apple” func changeString(newValue:inout String){ newValue =“三星” print(newValue) //输出:三星 打印(值) //输出:三星 } changeString(newValue:&value) 5.什么是swift模块? 模块是代码分发的单个单元。 […]