【我们都爱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了,这也就是为什么你不需要再初始化它的原因。
892 13
|
Unix iOS开发
【我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记1 IOS8概述
  首先感谢网易公开课和SwiftV课堂的朋友们辛苦翻译,这个系列是我学习斯坦福IOS8公开课的个人心得体会和笔记,希望能给大家带来启发。
1069 0
|
2月前
|
开发框架 前端开发 Android开发
安卓与iOS开发中的跨平台策略
在移动应用开发的战场上,安卓和iOS两大阵营各据一方。随着技术的演进,跨平台开发框架成为开发者的新宠,旨在实现一次编码、多平台部署的梦想。本文将探讨跨平台开发的优势与挑战,并分享实用的开发技巧,帮助开发者在安卓和iOS的世界中游刃有余。
|
23天前
|
iOS开发 开发者 MacOS
深入探索iOS开发中的SwiftUI框架
【10月更文挑战第21天】 本文将带领读者深入了解Apple最新推出的SwiftUI框架,这一革命性的用户界面构建工具为iOS开发者提供了一种声明式、高效且直观的方式来创建复杂的用户界面。通过分析SwiftUI的核心概念、主要特性以及在实际项目中的应用示例,我们将展示如何利用SwiftUI简化UI代码,提高开发效率,并保持应用程序的高性能和响应性。无论你是iOS开发的新手还是有经验的开发者,本文都将为你提供宝贵的见解和实用的指导。
117 66
|
9天前
|
存储 监控 API
app开发之安卓Android+苹果ios打包所有权限对应解释列表【长期更新】-以及默认打包自动添加权限列表和简化后的基本打包权限列表以uniapp为例-优雅草央千澈
app开发之安卓Android+苹果ios打包所有权限对应解释列表【长期更新】-以及默认打包自动添加权限列表和简化后的基本打包权限列表以uniapp为例-优雅草央千澈
|
1月前
|
开发框架 Android开发 iOS开发
安卓与iOS开发中的跨平台策略:一次编码,多平台部署
在移动应用开发的广阔天地中,安卓和iOS两大阵营各占一方。随着技术的发展,跨平台开发框架应运而生,它们承诺着“一次编码,到处运行”的便捷。本文将深入探讨跨平台开发的现状、挑战以及未来趋势,同时通过代码示例揭示跨平台工具的实际运用。
101 3
|
1月前
|
Java 调度 Android开发
安卓与iOS开发中的线程管理差异解析
在移动应用开发的广阔天地中,安卓和iOS两大平台各自拥有独特的魅力。如同东西方文化的差异,它们在处理多线程任务时也展现出不同的哲学。本文将带你穿梭于这两个平台之间,比较它们在线程管理上的核心理念、实现方式及性能考量,助你成为跨平台的编程高手。
|
2月前
|
存储 前端开发 Swift
探索iOS开发:从新手到专家的旅程
本文将带您领略iOS开发的奇妙之旅,从基础概念的理解到高级技巧的掌握,逐步深入iOS的世界。文章不仅分享技术知识,还鼓励读者在编程之路上保持好奇心和创新精神,实现个人成长与技术突破。
|
2月前
|
安全 IDE Swift
探索iOS开发之旅:从初学者到专家
在这篇文章中,我们将一起踏上iOS开发的旅程,从基础概念的理解到深入掌握核心技术。无论你是编程新手还是希望提升技能的开发者,这里都有你需要的指南和启示。我们将通过实际案例和代码示例,展示如何构建一个功能齐全的iOS应用。准备好了吗?让我们一起开始吧!
|
2月前
|
安全 Swift iOS开发
Swift 与 UIKit 在 iOS 应用界面开发中的关键技术和实践方法
本文深入探讨了 Swift 与 UIKit 在 iOS 应用界面开发中的关键技术和实践方法。Swift 以其简洁、高效和类型安全的特点,结合 UIKit 丰富的组件和功能,为开发者提供了强大的工具。文章从 Swift 的语法优势、类型安全、编程模型以及与 UIKit 的集成,到 UIKit 的主要组件和功能,再到构建界面的实践技巧和实际案例分析,全面介绍了如何利用这些技术创建高质量的用户界面。
36 2