【我们都爱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方法就会开始组合、组合直到全部累加完成输出。

目录
相关文章
|
前端开发 API
【我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记4 MVC enum Tuple Dictionary
 回顾一下我们上一话中的代码: @IBAction func operate(sender: UIButton) { let operation = sender.
772 0
|
前端开发 iOS开发
【我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记3 Xcode、Auto Layout及MVC
   继续上一话中的计算器Demo,上一话讲到类必须被初始化,类中的属性也必须被初始化,所以你不能只声明而不给它一个处置,那么问题来了,我们从storyboard中拖拽的@IBOutlet为什么只有声明而不需要初始化呢,这是因为它的类型依旧是一个optional,在你初始化之前已经被赋值为nil了,这也就是为什么你不需要再初始化它的原因。
845 0
|
Unix iOS开发
【我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记1 IOS8概述
  首先感谢网易公开课和SwiftV课堂的朋友们辛苦翻译,这个系列是我学习斯坦福IOS8公开课的个人心得体会和笔记,希望能给大家带来启发。
1024 0
|
2月前
|
API 数据安全/隐私保护 iOS开发
利用uni-app 开发的iOS app 发布到App Store全流程
利用uni-app 开发的iOS app 发布到App Store全流程
106 3
|
4月前
|
存储 iOS开发
iOS 开发,如何进行应用的本地化(Localization)?
iOS 开发,如何进行应用的本地化(Localization)?
123 2
|
4月前
|
存储 数据建模 数据库
IOS开发数据存储:什么是 UserDefaults?有哪些替代方案?
IOS开发数据存储:什么是 UserDefaults?有哪些替代方案?
42 0
|
2月前
|
API 开发工具 Android开发
iOS 和 Android 平台的开发有哪些主要区别?
iOS与Android开发区别:iOS用Objective-C/Swift,App Store唯一下载渠道;Android用Java/Kotlin,多商店发布(如Google Play、华为市场)。设计上,iOS简洁一致,Android灵活可定制。开发工具,iOS用Xcode,Android用Android Studio。硬件和系统多样性,iOS统一,Android复杂。权限管理、审核流程及API各有特点,开发者需依据目标平台特性进行选择。
38 3
|
12天前
|
前端开发 Android开发 iOS开发
【Flutter前端技术开发专栏】Flutter在Android与iOS上的性能对比
【4月更文挑战第30天】Flutter 框架实现跨平台移动应用,通过一致的 UI 渲染(Skia 引擎)、热重载功能和响应式框架提高开发效率和用户体验。然而,Android 和 iOS 的系统差异、渲染机制及编译过程影响性能。性能对比显示,iOS 可能因硬件优化提供更流畅体验,而 Android 更具灵活性和广泛硬件支持。开发者可采用代码、资源优化和特定平台优化策略,利用性能分析工具提升应用性能。
【Flutter前端技术开发专栏】Flutter在Android与iOS上的性能对比
|
12天前
|
存储 Swift iOS开发
使用Swift开发一个简单的iOS应用的详细步骤。
使用Swift开发iOS应用的步骤包括:创建Xcode项目,设计界面(Storyboard或代码),定义数据模型,实现业务逻辑,连接界面和逻辑,处理数据存储(如Core Data),添加网络请求(必要时),调试与测试,根据测试结果优化改进,最后提交至App Store或其它平台发布。
32 0
|
12天前
|
安全 Swift iOS开发
【Swift 开发专栏】Swift 与 UIKit:构建 iOS 应用界面
【4月更文挑战第30天】本文探讨了Swift和UIKit在构建iOS应用界面的关键技术和实践方法。Swift的简洁语法、类型安全和高效编程模型,加上与UIKit的紧密集成,使开发者能便捷地创建用户界面。UIKit提供视图、控制器、布局、动画和事件处理等功能,支持灵活的界面设计。实践中,遵循设计原则,合理组织视图层次,运用布局和动画,以及实现响应式设计,能提升界面质量和用户体验。文章通过登录、列表和详情界面的实际案例展示了Swift与UIKit的结合应用。