Processing math: 100%

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

目录
打赏
0
0
0
0
14
分享
相关文章
【我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记3 Xcode、Auto Layout及MVC
   继续上一话中的计算器Demo,上一话讲到类必须被初始化,类中的属性也必须被初始化,所以你不能只声明而不给它一个处置,那么问题来了,我们从storyboard中拖拽的@IBOutlet为什么只有声明而不需要初始化呢,这是因为它的类型依旧是一个optional,在你初始化之前已经被赋值为nil了,这也就是为什么你不需要再初始化它的原因。
908 13
【我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记4 MVC enum Tuple Dictionary
 回顾一下我们上一话中的代码: @IBAction func operate(sender: UIButton) { let operation = sender.
809 0
【我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记1 IOS8概述
  首先感谢网易公开课和SwiftV课堂的朋友们辛苦翻译,这个系列是我学习斯坦福IOS8公开课的个人心得体会和笔记,希望能给大家带来启发。
1085 0
安卓与iOS开发中的跨平台策略
在移动应用开发的战场上,安卓和iOS两大阵营各据一方。随着技术的演进,跨平台开发框架成为开发者的新宠,旨在实现一次编码、多平台部署的梦想。本文将探讨跨平台开发的优势与挑战,并分享实用的开发技巧,帮助开发者在安卓和iOS的世界中游刃有余。
uniapp开发ios打包Error code = -5000 Error message: Error: certificate file(p12) import failed!报错问题如何解决
uniapp开发ios打包Error code = -5000 Error message: Error: certificate file(p12) import failed!报错问题如何解决
227 67
uniapp开发ios打包Error code = -5000 Error message: Error: certificate file(p12) import failed!报错问题如何解决
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
84 8
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
深入探索iOS开发中的SwiftUI框架
【10月更文挑战第21天】 本文将带领读者深入了解Apple最新推出的SwiftUI框架,这一革命性的用户界面构建工具为iOS开发者提供了一种声明式、高效且直观的方式来创建复杂的用户界面。通过分析SwiftUI的核心概念、主要特性以及在实际项目中的应用示例,我们将展示如何利用SwiftUI简化UI代码,提高开发效率,并保持应用程序的高性能和响应性。无论你是iOS开发的新手还是有经验的开发者,本文都将为你提供宝贵的见解和实用的指导。
191 66
|
4月前
|
app开发之安卓Android+苹果ios打包所有权限对应解释列表【长期更新】-以及默认打包自动添加权限列表和简化后的基本打包权限列表以uniapp为例-优雅草央千澈
app开发之安卓Android+苹果ios打包所有权限对应解释列表【长期更新】-以及默认打包自动添加权限列表和简化后的基本打包权限列表以uniapp为例-优雅草央千澈
237 11
安卓与iOS开发中的跨平台策略:一次编码,多平台部署
在移动应用开发的广阔天地中,安卓和iOS两大阵营各占一方。随着技术的发展,跨平台开发框架应运而生,它们承诺着“一次编码,到处运行”的便捷。本文将深入探讨跨平台开发的现状、挑战以及未来趋势,同时通过代码示例揭示跨平台工具的实际运用。
216 3
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等