使用Swift圈出图片

在此网站以及许多其他网站上,个人资料图片是圆形的。 它可以使您的应用从一系列的盒子开始,到开始在其后面进行一些设计时,非常有效。 可喜的是,这绝对是小菜一碟! 声明自己一个UIIMageView,然后将图像加载到其中,方法是使用故事板进行设置,或者可以使用UIImagePicker。 要使用UIImagePicker,您需要使您的类从几个委托中继承: 类exampleClassName:UIViewController,UIImagePickerControllerDelegate,UINavigationControllerDelegate {//插入类代码 } 如您所见,UIImagePickerControllerDelegate和UINavigationControllerDelegate都是必需的。 要实现这些,您需要首先创建UIImagePickerController类型的变量以在代码中使用。 首先,在viewDidLoad中: 覆盖func viewDidLoad(){ super.viewDidLoad() //创建一个UIImagePickerController对象 imagePicker = UIImagePickerController() //图像选择器委托是此类 imagePicker.delegate =自我 } 现在,我们有一个可供使用的图像选择器。 所以我们只需要使用它。 因此,只要您希望用户选择图像,就说在按下按钮之后,您将需要展示imagePicker视图控制器,这是通过以下代码行完成的。 presentViewController(imagePicker,动画:true,完成:无) 它只是说明要呈现一个特定的视图(imagePicker视图),然后将其与动画一起移动。 完成后,我们什么也不想做。 您可以在呈现此视图之后插入想要发生的额外代码,也许存储图像,或以某种方式对其进行修改,但这不是本教程的内容。 将向用户显示其照片部分,以便他们可以选择照片,就像打开了“照片”应用程序一样。 点击照片时,将选择照片。 但是,视图控制器将保留。 因此,我们需要从UIImagePickerControllerDelegate中使用另一个函数: func imagePickerController(picker:UIImagePickerController,didFinishPickingImage image:UIImage,editInfo:[String:AnyObject]?){ imagePicker.dismissViewControllerAnimated(true,完成:无) theImage.image =图片 } 这看起来确实比较复杂,但是函数调用是Delegate的一部分,因此Xcode会自动为您完成该操作。 但是我们要说的是,再次关闭imagePicker视图控制器,而没有完成代码。 就是这样了。 您已经选择了图像。 并使其变得圆润: //此行设置您想要的半径。 //这将形成一个完美的圆圈。 //较小的值将使圆角正方形 theImage.layer.cornerRadius = theImage.frame.size.width / 2 //这设置是否将图像裁剪到此边框。 theImage.clipsToBounds […]

Swift 5和ABI稳定性-最佳迁移时间

Swift是一种快速,安全且有趣的语言,具有充分的堆栈潜力和强大的社区支持,可以进行编码。 据Apple称,它比Objective-C快2.6倍,但是,一些研究表明,两者之间的差异并不大。 Swift代码更容易维护,因为没有单独的接口和实现文件,语法较短,并且该语言支持动态框架。 该语言已显着发展,并已被众多开发人员采用。 根据StackOverflow开发人员调查2018,它是第六受欢迎的语言 。对于仅在2014年发布的一种语言,采用率是惊人的。 这些是Swift的一些优点,现在让我们从开发人员的角度来看这些缺点。 Swift仍不成熟,就像一个移动的目标,每个新发行版都引入了重大更改。 许多开发人员指出的关键问题之一是缺乏与较旧语言版本的向后兼容性以及版本锁定,这意味着整个项目及其外部依赖项中只能有一个Swift版本。 因此,如果开发人员想要切换到最新的Swift版本并更新其外部依赖关系,则被迫完全重写其项目。 对于开发框架的开发人员,他们必须为每个新的Swift版本更新其框架,并且不能将其作为二进制预编译框架进行分发。 幸运的是,Swift团队和开放源代码社区正在努力解决此问题,并有望在Swift的下一个主要版本(即Swift 5.0)中解决此问题,自Swift 3.0以来,Swift已向前推进。 ABI稳定宣言指出,他们的目标是: 源代码兼容性,这意味着较新的编译器可以编译用较早版本的Swift编写的代码。 这将删除Swift中当前的版本锁定。 二进制框架和运行时兼容性,从而可以以二进制形式分发框架,该框架可在多个Swift版本中使用。 二进制框架兼容性将通过稳定模块文件的模块格式稳定性来实现,该模块文件格式是编译器对框架公共接口的表示,而ABI稳定性使应用程序和使用不同Swift版本编译的库之间具有二进制兼容性。 在运行时,Swift程序二进制文件与其他库和组件进行交互。 应用程序二进制接口是独立编译的二进制实体必须遵循的规范,才能链接在一起并执行。 这些二进制实体必须在许多底层细节上达成共识,例如如何调用函数,内存中的数据表示,甚至它们的元数据在哪里以及如何访问它。 ABI稳定性意味着将ABI锁定到将来的编译器版本可以生成符合稳定ABI的二进制文件的程度。 一旦ABI稳定下来,它就会在平台的整个生命周期中持续存在。 ABI稳定性仅影响外部可见的公共接口和符号的不变性。 例如,只要保留公共接口,以后的编译器就可以自由更改内部函数调用的调用约定。 类型(例如结构和类)必须具有针对该类型实例的已定义内存中布局,并共享相同的布局约定。 类型元数据被Swift程序广泛使用。 此元数据必须具有定义的内存布局,或者必须具有一组定义的API来查询类型的元数据。 库中的每个导出或外部符号都需要一个唯一的名称,二进制实体可以同意该名称。 Swift提供了函数重载和上下文名称空间(例如模块和类型),这意味着源代码中的任何名称都可能不是全局唯一的。 唯一名称是通过称为名称修饰的技术产生的。 函数必须遵守调用约定,这涉及诸如调用堆栈的布局,保留哪些寄存器以及所有权约定之类的事情。 Swift附带一个运行时库,该库处理诸如动态转换,引用计数,反射等操作。编译的Swift程序对该运行时进行外部调用。 因此,Swift运行时API是Swift ABI。 Swift随附一个标准库,该库定义了许多常见的类型,结构和操作。 为了使出厂的标准库能够与用不同版本的Swift编写的应用程序一起使用,它必须公开一个稳定的API。 因此,Swift标准库API是Swift ABI,以及它定义的许多类型的布局。 所有这些任务已由Swift核心团队完成,但尚未在GitHub上发布。 通过查看任务的状态,我们可以放心地期望Swift的下一个主要版本是ABI稳定的。 因此,一旦宣布Swift是ABI稳定的,此后编写的代码将与该语言的新版本兼容,并且开发人员在迁移到新版本的Java时不必更新项目的所有外部依赖项。迅速。 一旦实现了模块格式的稳定性,库作者就可以将其框架作为二进制框架提供。 由于可以在操作系统内合并稳定的Swift运行时,因此应用程序包的大小将减小。 语言将不断发展,但从那时起对ABI的更改将是可加的。 当最低目标Swift版本支持它们时,可以利用ABI附加更改,因为ABI稳定性仅锁定外部可见的公共接口和符号。 较新的编译器可以进行内部更改,以提高效率。 Swift显然是Apple生态系统中发展的未来,一旦稳定了ABI和模块格式,该语言将摆脱最大的劣势。 请仔细阅读本文,以了解2019年Swift和Objective-C之间的详细比较。 如果您希望将Objective-C代码库转换为Swift,那么现在是开始的最佳时间。 我写了一篇文章,内容涵盖了从SVProgressHUD到IHProgressHUD的转换,该文章完全是用Swift编写的,具有线程安全性,并且具有与使用Swiftify for Xcode的SVProgressHUD相同的API设计。 https://github.com/apple/swift/blob/master/docs/ABIStabilityManifesto.md […]

Swift 3.0 for循环语法

由于最近几年我的大部分代码都是使用Swift编写的,因此我一直在调整以使其更具表现力的for循环语法。 现在,用分号语法表示的旧“经典”将不再在Swift中得到支持,我在学习所有新选项时投入了真正的力量! 如果您已经编程了一段时间,无论您是从K&R C(像我一样!),甚至从C ++或Java入手,您可能已经习惯了以下基于C的for循环语法: for (int i=0; i<10; i++) { printf("%d", i); } // printf() is called 10 times 因此,作为我的参考(以及您的参考,如果您愿意),以下是我需要死记硬背的事情: 循环的旧时光(K&R C — ish) for i in stride(from: 0, to: 10, by: 1) { print(“\(i)”) } // print() is called 10 times 好的,这是使用stride函数,在搜索for循环语法时我看不到很多。 但我实际上有点喜欢。 是的,这有点冗长。 但这确实告诉您发生了什么,不是吗? 在经典C语法中,最常用的增量表达式是i++ ,表示“增量1”。 但是有时您想将数字提前1个离散数字,例如: for (int i=0; i<10; i […]

新的iOS应用程序? Objective-C还是Swift?

就像面对空白画布的艺术家一样,开发新的移动应用程序的开发人员必须首先选择一种媒介来构建其数字创作。 与本地iOS应用程序开发有关,交易的主要工具是Objective-C和Swift编程语言。 如果我们的计划不够干净,我们将不得不考虑现有技能集的价值,因为它们与维护现有代码库有关。 但是,出于本文的目的,我们将仅关注新建项目。 在2014年6月之前,我们的决定很简单,因为我们可以用Objective-C程序员的身份广泛地绘画所有iOS开发人员。 Objective-C起源于1980年代初期-基于1970年代初期的C编程语言。 它与C的关系的主要好处是C ++库可以与Objective-C代码一起使用。 超过30年的发展已融入到Objective-C中,这巩固了它作为一种既定且稳定的编程语言的地位。 自2008年7月应用程序商店问世以来,已经发布了超过1,000,000个Objective-C应用程序。 在Stack Overflow上标记的超过25万个问题和Amazon.com上的数百本书中,可以明显看出Objective-C开发人员社区的经验。 iOS开发者社区在2014年6月分叉,当时苹果正式宣布Swift作为Objective-C的替代品。 自发布以来的800天内,Swift已大大超越了Objective-C,成为iOS应用程序开发人员的首选编程语言。 衡量Swift进度的一种方法是通过TIOBE编程社区索引。 这是每月的领头羊,旨在通过客观标准来衡量编程语言的受欢迎程度。 Swift与Objective-C的关系的另一项检验是通过Google趋势。 这项措施会在定义的时间段内捕获感兴趣的字词的网络搜索流量。 通过这些指标建立的模式是,我们已经达到了一个转折点,因为Swift与开发人员的思想份额有关,因此它已经超过了Objective-C。 转移到Swift的原因是什么? 作为开发人员和架构师,与我最共鸣的是Swift提供的超过Objective-C的简便性。 正如1977年苹果计算机公司的早期口号一样, “简单是最终的复杂程度。” Swift在以下方面与Objective-C相关,产生了简化的好处: 由于语法更像脚本,因此代码更具可读性。 这也有助于减少初始学习曲线。 与Objective-C的冗长性相比,您编写的代码更少。 您甚至可以将表情符号字符用作变量名… 通过iPad上的Swift Playground应用程序可以证明Swift是交互式的。 Swift编程语言是开源的。 这使语言同行评审,透明,并使社区更加参与。 您可以通过在Github上为Swift做出直接而直接的影响。 展望未来,很明显,书的作者和视频教程已经迁移到Swift。 就数据结构和算法的性能而言,与Objective-C相比,Swift几乎可以与之媲美或更好。 Swift还为创建新应用程序提供了机会,这些应用程序可以重构旧的Objective-C项目。 用苹果自己的话来说, “ …我们现在可以为Apple软件开发的未来引入一种新的语言…所有这些使Swift成为开发人员和Apple未来的可靠投资。 Swift是编写iOS,macOS,watchOS和tvOS应用程序的绝妙方法,并且将随着新功能的发展而不断发展。 我们对Swift的目标是雄心勃勃的。 我们迫不及待想看到您使用它创建的内容。” 如果您要启动新的本机iOS应用程序,则应该客观地将Swift视为制作下一个杰作的主要工具。 参考文献 Swift –苹果开发人员 Swift是一种功能强大且直观的编程语言,适用于iOS,OS X,tvOS和watchOS。 编写Swift代码是…… developer.apple.com Objective-C –维基百科,免费的百科全书 GNU项目基于OpenStep…开始了其名为Cocoa的自由软件实现的工作,该实现名为 GNUstep。en.wikipedia.org TIOBE索引| […]

了解Swift的CharacterSet

tldr:单击 此处 查看 CharacterSet.decimalDigits 所有 CharacterSet.decimalDigits 您是否曾经需要检查过字符串是否仅由数字组成? 标点符号或非字母数字字符的存在如何? 一个人可以使用多种方法,从Formatter类之一到NSScanner甚至是NSPredicate ,但是您发现的最可能的代码片段涉及到使用反向的CharacterSet 。 简而言之, CharacterSet是一个由Objective-C桥接的Swift类,它代表一组Unicode字符。 它的Objective-C对应物NSCharacterSet本身是免费的,与Core Foundation的CFCharacterSet桥接。 CFCharacterSet用C编写,相当古老,至少可以追溯到Mac CFCharacterSet的主要思想是提供一种支持Unicode的数据结构,以帮助有效地搜索Unicode字符串。 NSString和NSScanner内部使用NSCharacterSet进行字符串搜索操作。 可以将CharacterSet初始化为空集,也可以将其初始化为字符串,字节或文件内容中存在的一组字符。 它带有许多方便的预定义集合(例如URL查询片段中允许的字符或字母数字字符),甚至还允许集合代数(例如并集,交集和异或)。 使用CharacterSet的预定义集合之一感觉很方便: 请注意,四个8位和两个16位都加起来为32位。 这完全是设计使然:UTF32是固定宽度格式,UTF8和UTF16可以轻松装入其中,而无需进行任何额外工作。 所有UTF32字符都包含32位,即使不是必需的。 这使格式无效,但是有一个好处 :它非常适合搜索,因为您可以遍历第32位以获得下一个字符,而不用解码每个字节来解码该字符的代码点宽度。 这正是NSCharacterSet.characterIsMember(UTF8 or UTF16 or UTF32)内部调用仅接受UTF32字符的longCharacterIsMember(UTF32)的原因NSCharacterSet.characterIsMember(UTF8 or UTF16 or UTF32) 在CharacterSet搜索字符成员资格的最佳方法是获取该CharacterSet的UTF32代码点,并将其传递给NSCharacterSet的longCharacterIsMember() 。 看起来像这样: 以下是将字符的代码点值转换为UTF8二进制文件的方法:在上表中的所有x s中填充字符的二进制值。 要确定需要多少字节,请考虑二进制字符编码的长度。 1字节的UTF8仅可容纳7位(表中仅7 x s)。 一个2字节的UTF8可以容纳11位。 3字节可容纳16位,而4字节UTF8可容纳21位。 对于“€”字符(U + 20AC 10 0000 1010 1100 ),我们至少需要14位,这意味着它将需要3个字节的结构,可以容纳12至16位。 填充到UTF8结构中的二进制数字如下所示: […]

仅在Swift中使用约束来扩展UITableView单元格

这是一个常见的要求,您在创建iOS应用时可能会偶然发现。 首先,我们要实现的结果。 让我们跳入Xcode并创建一个新的“ Single View Application”项目。 我们将从设计界面开始。 一个以ViewController为根的简单UINavigationController即可 。 让我们添加我们的UITableView并向其中添加一个UITableViewCell 。 我们需要两个标签,一个是标题,另一个在下面,是显示或隐藏的字幕。 因为我们要让AutoLayout自动计算像元高度,所以我们需要相应地设置约束。 在两个标签上添加前导和尾随约束。 然后,我们要在标题及其超级视图之间添加顶部约束,在字幕及其超级视图之间添加底部约束,并在两个标签之间添加垂直间距约束。 这将使AutoLayout能够了解我们希望基于标签的固有高度来增加超级视图。 我们还将两个标签的numberOfLines属性都设置为零,因此它们不会被截断。 那时,AutoLayout可能会显示错误,要求您为其中一个标签设置不同的垂直拥抱优先级。 似乎是逻辑,因为目前两者都具有相同的优先级,并且AutoLayout需要知道哪个优先。 我们可以降低垂直的拥抱优先级,也可以为两个标签设置一个固定的高度限制,以消除此错误。 目前,我们的UI似乎不错,让我们深入研究代码! 首先,我们需要为原型UITableViewCell创建一个新类。 为了独具匠心,我们可以将其称为ExpandingTableViewCell 。 添加两个标签出口,并将它们链接到InterfaceBuilder中的实际视图。 现在,为我们的单元提供支持类是一个好主意。 您可以使用简单的字典,但是具有类型化的属性始终是一个加号。 为了准确表示我们的单元格状态,我们需要一个标题,副标题和一个布尔值以检查单元格是否扩展。 现在已经解决了,放到我们的ViewController上 ! 我们想要一个链接到UITableView的属性,另一个是将包含单元格表示形式的数组的属性。 让我们用一些ExpandingTableViewCellContent实例填充它,以便稍后显示。 我们仍然必须实现UITableView的数据源,更重要的是实现魔术的委托! 在我们的委托方法didSelectRowAtIndexPath中 ,我们需要两件事: –在特定索引处更改支持类的扩展状态 –重新加载单元以反映其新状态 好了,一切似乎都准备就绪,让我们构建并运行(命令+ R)! 哎呀,那不是我们想要的! 好吧,我们错过了ViewController viewDidLoad中的最后一个细节,以使其成为本垒打。 我们需要向UITableView明确指定AutoLayout应注意我们的单元格高度。 分两行完成: tableView.estimatedRowHeight = 60 tableView.rowHeight = UITableViewAutomaticDimension 这次,代码应该可以平稳运行并正常运行。 请享用! 希望您喜欢本教程,可以在github上找到其源代码。 如果发现有用,请随时喜欢/评论!

iOSをMVC,MVP,MVVM,清洁架构で実装してみた

何番煎じだよって感じですが,アーキテクチャに対する考チャに対する方は割と正解がなくて,自分の中に一つ落とし込んでおいて损はないと感じたため,补充という形で记事にさせていただきます。 アーキテクチャとは? 一言でいうと, アプリケーションを绮丽丽装するための设计方法! アーキテクチャを考虑しない设计でコードを书いていると以下のようなスにぶち当たります。 一つのクラスの肥大化(iOSで言うところのFatViewController) ロジックが烦雑になる 同じ处理を使い回せない チーム开発で役割分担しにくい テストがしにくい 属人化が进み,引き継ぎが难しくなる 机能の追加,修正が困难 等等… 正直まだまだあるとは思いますが,とにかく设计はこだわってないと后で地狱を见るということさえ伝わればOKです。 示例应用 アーキテクチャを语る上で叩き台にするアプリがいるなーと思ったので作りました。 阅覧するときは,见たいアーキテクチャのチャランチ(master / mvc / mvp / mvvm / clean-architecture / clearn-architecture + mvvm)に切り変えてください。 https://github.com/rockname/ArchitectureSampleWithFirebase Firebaseでユーザーの登录/登录,投稿のCRUD处理をする,ものすごくシンプルなアプリです。 FatViewController ブアーキテクチャのない世界をみなさんにはお见せしましょう。(ブランチはmasterです) 投稿一覧シーンであるListViewControllerを见てもらうとわかりますが,こんなに単纯なアプリにもかかわらずすでにコードが123行あります。 ViewControllerがすべての役割を担わされていることがわかりますね。 非常に胖な状态です。 役割 ViewController UIのレイアウト UIの更新 ユーザーのアクション通知 データの处理 データの更新通知 ビジネスロジック 评価 いいところ🙆‍ 思考停止でコーディングできる(これはいいところなのか…?) UIKitの恩恵を最大に享受できる 悪いところ🙅‍ それ以外すべて 模型视图控制器(MVC) Webアプリケーションフレームワークでよく闻くやつですね。 Appleの公式ドキュメントでもiOSアプリ开発はMVCが一般的みたいな书き方がされています。 https://developer.apple.com/jp/documentation/CocoaEncyclopedia.pdf しかし,iOSのUIフレームワークであるUIKitはViewとControllerが密接に系がっており(ViewControllerというクラスがあるくらい),iOSのMVCはよくMassiveViewControllerだなんて皮肉を言われています。。 […]

flatMap方法的实际应用— Swift 3

这一次,我们将讨论flatMap方法。 但是首先让我们考虑一下上下文。 假设我们有一个数组数组: var arrayOfArrays = [ [1, 1], [2, 2], [3, 3] ] 将其内容乘以2是一个挑战,其结果应如下所示: // [[2,2],[4,4],[6,6]] 解决此难题的一种方法可能是两次使用map Array的方法,如下所示: //首先迭代数组的数组 arrayOfArrays。 映射 {数组在 //和第二次迭代 //当前数组 返回数组。 映射 {中的整数 //将其内容乘以2 返回整数* 2 } } // [[2,2],[4,4],[6,6]] 好的,接下来是一个新的挑战,将乘法数组转换为仅一个数组,如下所示: // [2,2,4,4,6,6] 幸运的是Array的结构为此目的有一个称为joined ,让我们使用它: var multipliedByTwo = arrayOfArrays。 映射 {数组在 返回数组。 映射 {中的整数 返回整数* 2 } } var flattened […]

使用Swift 3.0建立倒数计时器

在这里,您将看到如何使用Swift 3.0为iOS构建一个简单的计时器。 我假设您对Swift编程语言,Xcode和Storyboard有基本的了解。 如果您需要基础知识方面的帮助或在情节 提要中 设置UI,请访问 www.raywenderlich.com, 以获得一些很棒的初学者教程。 计时器类 我们将使用Apple提供的Timer类。 在文档中定义了一个计时器,如下所示: “计时器等待直到经过一定的时间间隔,然后触发,将指定的消息发送到目标对象。” “例如,您可以创建一个 Timer 对象, 该 对象将消息发送到窗口,告诉窗口在一定时间间隔后进行更新。” 创建Timer类的目的是使它易于在特定时间触发动作(例如更新标签或触发方法)。 建立计时器 创建一个新的“ Single View Application”,为其命名,并将语言设置为Swift。 在情节提要中新建一个视图控制器,或使用预先存在的默认视图控制器。 添加标签。 (此标签将显示开始时间以及以秒,分钟和小时为单位的倒计时。) 添加三个按钮:“开始”,“暂停”和“重置”。 我的初始设置如下: 注意:在标签中设置为占位符文本的内容无关紧要,因为我们将在代码中提供标签文本。 我使它看起来像一个计时器,但它的工作原理与“标签”一词一样好。 但是,您为标签设置的字体将在程序运行时显示。 我选择Courier New,因为它是等距的(所有字母/数字都相同的宽度),并且不会随着数字递减而四处移动。 3.将标签和按钮从情节提要板连接到视图控制器类。 快捷方式:要从Storyboard中的助手编辑器中打开View Controller文件,请按住Option,然后在左侧的Navigation inspector / menu中单击类文件。 我假设您知道如何将标签和按钮连接到适当的类。 4.接下来离开情节提要,转到“视图控制器”类。 在timerLabel出口下,创建以下变量: var seconds = 60 //此变量将保留秒的起始值。 它可以是大于0的任何数量。 var timer = Timer() var isTimerRunning = […]

为什么现在应该学习如何在Swift中进行编码

从来没有比现在更好的时间成为应用程序开发人员。 随着网站越来越多,过时的公司正在从Web切换到应用程序,并且此过程才刚刚开始。 苹果公司在2014年首次推出的Swift语言已成为世界上最重要的编程语言之一。 使这种语言如此流行的原因是,正确教授它非常容易学习。 这就是为什么在选择有关该语言的在线课程时需要仔细选择的原因。 大多数课程都以“创建Instagram”或​​“制作自己的Facebook,Snapchat等”之类的承诺使学生蒙蔽,这是荒谬的。 坦率地说,无论老师多么出色,都不可能创建一个可以让数百人在几个月内,数小时内使用它的应用程序。 但是我必须承认我也信守了那些诺言,这就是为什么我知道它们是错误的。 尽管您可能会以流行的应用程序的较差版本结尾,但是您对应用程序或编程语言的工作方式一无所知。 您将无法使用这些克隆中的任何一个来增强您的履历,因为您将无法向任何人解释代码为何起作用,因为您所做的只是复制并粘贴了教师告诉您的内容。 这就是为什么我们在RUME学院决定现在是时候创建自己的语言课程了。 我与同事Johannes Ruof一起教的课程非常适合希望开始学习如何使您的应用创意成为现实的每个人。 我们涵盖了该语言的所有重要方面,即使您是初学者,我们的教学方法也包含帮助您理解它的实际示例。 我们已经培训了7500多名学生,并使数百人以Swift开发人员的身份开始了自己的事业。 一旦成为开发人员,就有许多工作机会在等待着您。 无论您是选择在公司工作,是自由职业者,还是想创建自己的应用程序并使您的想法成真。 Swift被认为是初学者最简单的编程语言之一,因为它很容易理解和应用。 它是用于开发iOS和MacOS应用程序的语言。 有可靠的谣言称,谷歌也在考虑将Swift用作Android的首选编程语言。 我们的课程是作为iOS开发人员成功事业的完美起点,为了使您更轻松地做出决定,我们为所有阅读本文的人提供92%的折扣。 只需点击此课程链接即可 或在udemy上使用代码:MEDIUM15。