【我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记7 AnyObject、Functions

简介: 新的一话中我们将讲讲Foundation的一些相关知识,首先来看AnyObject。 为了方便理解,你可以任务AnyObject是某种类型,虽然它并不是。

新的一话中我们将讲讲Foundation的一些相关知识,首先来看AnyObject。


为了方便理解,你可以任务AnyObject是某种类型,虽然它并不是。AnyObject的存在是为了兼容现有的OC和IOS的代码,你并不会经常使用它来构建你自己的数据结构。Swift是强类型语言,并有类型推断的特性。AnyObject是一个指向对象的指针,也就是说它是一个类的实例,但它是一个指向未知类的指针。我们所需要关注的是在哪些场合来使用它,StroyBoard中会出现AnyObject,还有在某些函数的参数中见到AnyObject。

因为AnyObject是一种未知类型的指针,所以我们不能向它发送任何消息,为了使用它我们把它转换成一种我们知道的类型,我们唯一使用AnyObject的方法就是把它转化成我们知道的类。


我们可以定义一个我们已知类型的变量,然后使用“变量 = AnyObject 转换后的东西”。


这里有两种方式,一种叫做casting(转换),我们使用as进行强转。如果你不确定你强转的对象是不是你需要的类型,那么使用if -let结构加上as?来进行判断,这时as?会返回一个可选的结果。

你也可以使用更简单的语法 if A is B{...}


如果你遇到的是一个AnyObject类型的数组,我们会遇到这样的问题,这时IOS的一些遗留问题造成的,比如toolbarItems就是一个[AnyObject]类型的。我们要确认数组中的每个元素都是我们想要的类型,那么必须使用一个遍历,示例中提供了两种遍历方法。这里不能用as?因为在一个nil中做循环没意义,所以你最好确认你的数组中的元素是你想要的类型。


另外一个例子是我们之前在storyboard中拖拽生成action的时候如果保留sender为AnyObject会怎么样呢?如示例所示我们使用as转换它也可以起到相同效果,但是繁琐的很,所以这就是为什么要保证如果是一个按钮触发了action那么sender的类型就一定要是一个UIButton的缘故了。假如有多个控件使用同一个action,那么需要判断sender的类型给出不同的做法,这时就需要sender的类型是AnyObject了。当然你可以这么做,然而这样的做法真的很罕见。


另外一种情况,UIButton使用buttonWithType方法新建一个button对象的时候返回的其实是个AnyObject。下面就可以使用这种写法button as UIButton然后就可以使用UIButton的方法和属性了。


casting(类型转换)并不仅限于AnyObject,你可以转换任意两个对象,对于非AnyObject的对象,需要在同一继承链上才能转换,并且只能沿着继承链向下转型。如例所示,定义一个UIviewController类型的,虽然使用了CalculatorViewCotroller的构造器,但是Swift默认它还是一个viewController,不会响应它的enter方法。

所以我们需要转型之后再调用方法。


下面来看一些Funtions(函数)

首先是数组中的一些函数。我们知道数组中可以使用+=,但是这个函数的右边需要是[T](我们又遇到泛型了),所以如果你要把一个东西加到数组中,那么把它放到中括号中,有些人会在这里犯错误直接去+=一个元素,要知道+=只能连接两个数组。

数组还有一些有趣的元素,first和last会返回数组第一个和最后一个元素,它们是可选型。

数组中的一些方法比如我们之前接触到的append、可选择插入位置的insert还有可以选择插入位置并且插入新数组的splice。

remove也有两个方法,删除一个元素和删除一个子数组。

另外还有replace方法,你可以选择被替换的元素区间,并且替换和被替换的元素个数不必相等,比如你把原来数组的三个元素替换成了6个,那么数组就变长了。

同时数组也有排序方法sort。排序方法接受一个函数作为参数,一个决定两个元素谁放在前面的函数,默认的是使用小于号的比较。通常会把排序函数写成一个闭包。例如a.sort{$0<$1},闭包会被不停地调用,它采用的是快排或者其他任意的排序方法。



这里还有三个非常酷的方法:

filter方法可以将你不喜欢的元素过滤掉之后返回给你剩余的数组。

另外一个很酷的方法是mapping,这会将你原来数组中的元素映射到一个新的数组中,甚至新的数组的元素类型与原数组的类型都可以不一样,我可以把一个Int类型的映射成一个String类型的新数组。你可以看到示例中展示了Swift强大的闭包特性。

还有一个方法是reduce方法,可以把我们的数组变成一个元素,你需要指定一个初始值,示例中的初始值是第一个元素,然后在闭包中写一个reduce的规则,示例中是一个累加的规则,然后reduce方法就会开始组合、组合直到全部累加完成输出。

目录
相关文章
|
前端开发 iOS开发
【我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记3 Xcode、Auto Layout及MVC
   继续上一话中的计算器Demo,上一话讲到类必须被初始化,类中的属性也必须被初始化,所以你不能只声明而不给它一个处置,那么问题来了,我们从storyboard中拖拽的@IBOutlet为什么只有声明而不需要初始化呢,这是因为它的类型依旧是一个optional,在你初始化之前已经被赋值为nil了,这也就是为什么你不需要再初始化它的原因。
873 0
|
Unix iOS开发
【我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记1 IOS8概述
  首先感谢网易公开课和SwiftV课堂的朋友们辛苦翻译,这个系列是我学习斯坦福IOS8公开课的个人心得体会和笔记,希望能给大家带来启发。
1062 0
|
11天前
|
开发框架 前端开发 Android开发
安卓与iOS开发中的跨平台策略
在移动应用开发的战场上,安卓和iOS两大阵营各据一方。随着技术的演进,跨平台开发框架成为开发者的新宠,旨在实现一次编码、多平台部署的梦想。本文将探讨跨平台开发的优势与挑战,并分享实用的开发技巧,帮助开发者在安卓和iOS的世界中游刃有余。
|
2月前
|
Java Android开发 Swift
安卓与iOS开发对比:平台选择对项目成功的影响
【10月更文挑战第4天】在移动应用开发的世界中,选择合适的平台是至关重要的。本文将深入探讨安卓和iOS两大主流平台的开发环境、用户基础、市场份额和开发成本等方面的差异,并分析这些差异如何影响项目的最终成果。通过比较这两个平台的优势与挑战,开发者可以更好地决定哪个平台更适合他们的项目需求。
118 1
|
2天前
|
Java 调度 Android开发
安卓与iOS开发中的线程管理差异解析
在移动应用开发的广阔天地中,安卓和iOS两大平台各自拥有独特的魅力。如同东西方文化的差异,它们在处理多线程任务时也展现出不同的哲学。本文将带你穿梭于这两个平台之间,比较它们在线程管理上的核心理念、实现方式及性能考量,助你成为跨平台的编程高手。
|
4天前
|
存储 前端开发 Swift
探索iOS开发:从新手到专家的旅程
本文将带您领略iOS开发的奇妙之旅,从基础概念的理解到高级技巧的掌握,逐步深入iOS的世界。文章不仅分享技术知识,还鼓励读者在编程之路上保持好奇心和创新精神,实现个人成长与技术突破。
|
19天前
|
安全 数据处理 Swift
深入探索iOS开发中的Swift语言特性
本文旨在为开发者提供对Swift语言在iOS平台开发的深度理解,涵盖从基础语法到高级特性的全面分析。通过具体案例和代码示例,揭示Swift如何简化编程过程、提高代码效率,并促进iOS应用的创新。文章不仅适合初学者作为入门指南,也适合有经验的开发者深化对Swift语言的认识。
39 9
|
15天前
|
设计模式 Swift iOS开发
探索iOS开发:从基础到高级,打造你的第一款App
【10月更文挑战第40天】在这个数字时代,掌握移动应用开发已成为许多技术爱好者的梦想。本文将带你走进iOS开发的世界,从最基础的概念出发,逐步深入到高级功能实现,最终指导你完成自己的第一款App。无论你是编程新手还是有志于扩展技能的开发者,这篇文章都将为你提供一条清晰的学习路径。让我们一起开始这段旅程吧!
|
18天前
|
Android开发 Swift iOS开发
探索安卓与iOS开发的差异和挑战
【10月更文挑战第37天】在移动应用开发的广阔舞台上,安卓和iOS这两大操作系统扮演着主角。它们各自拥有独特的特性、优势以及面临的开发挑战。本文将深入探讨这两个平台在开发过程中的主要差异,从编程语言到用户界面设计,再到市场分布的不同影响,旨在为开发者提供一个全面的视角,帮助他们更好地理解并应对在不同平台上进行应用开发时可能遇到的难题和机遇。
|
16天前
|
iOS开发 开发者
探索iOS开发中的SwiftUI框架
【10月更文挑战第39天】在苹果的生态系统中,SwiftUI框架以其声明式语法和易用性成为开发者的新宠。本文将深入SwiftUI的核心概念,通过实际案例展示如何利用这一框架快速构建用户界面,并探讨其对iOS应用开发流程的影响。