美文网首页
每天学一点Swift----面向对象下(五)

每天学一点Swift----面向对象下(五)

作者: 冯可乐同学 | 来源:发表于2017-06-09 22:07 被阅读7次

四.嵌套类型

1. Swift允许在一个类型的内部定义另一个类型,这种机制被称为嵌套类型。

2.对比于Java,Swift的嵌套类型就类似于Java中的内部类。

3. Swift的枚举、结构体、类的内部都可以定义嵌套类型,被嵌套的类型也可以是枚举、结构体和类。Swift的嵌套类型支持多级嵌套,即嵌套类型还可以再包含嵌套类型。

4.需要注意的是:嵌套类型不允许使用static或class修饰,也就是说,嵌套类型没有所谓的类型相关的嵌套类型。

五.扩展

1.在项目开发中,有时候需要为已有的类扩展一些新的行为,关于这种扩展行为,最容易想到的就是继承,通过继承可以重写父类已有的方法。但有些时候,使用继承并不是最好的选择,此时就需要借助于扩展来实现了:扩展是Swift的一种动态特征,Swift允许使用扩展为现有的类添加新方法,并且不需要创建子类,不需要访问原有类的源代码。

2. Swift的扩展和Objective-C中扩展并不相同,而是和Objective-C的分类比较相似,只是Swift的扩展没有名字。

3. Swift中的扩展提供如下功能:

(1)添加类型存储属性;(2)添加实例计算属性和类型计算属性;(3)添加实例方法和类型方法;(4)添加新的构造器,而且新添加的构造器不影响原有的;(5)添加下标;(6)定义和使用新的嵌套类型;(7)使一个已有类型符合一个或多个协议。

4.扩展可以添加新的功能,但扩展并不是派生子类,因此扩展不支持重写。

5.扩展的定义为:

[修饰符] extension已有类型

{

//添加新功能

}

6.通过扩展让已有的类型遵守一个或多个协议的格式为:

[修饰符] extension已有类型:协议1,协议2

{

//实现协议方法

}

7.如果程序通过扩展为一个已有类型添加了新功能,那么这个新功能在该类型的所有已有实例中都是可用的,即使它们是在这个扩展之前定义的。

8.使用扩展添加属性:使用扩展可以添加3种属性————类型存储属性,实例计算属性,类型计算属性。使用扩展不能添加实例存储属性。

9.举个栗子:

extension String

{

//通过扩展添加类型存储属性

static var data : [String : Any] = [:]

//定义一个实例计算属性,并为该属性提供getter、setter部分

var length : Int{

get{

//getter部分

}

set

{

//setter部分

}

}

}

上面程序中,第一行代码为String结构体增加了一个名为data,类型为[String : Any]的存储属性,这样程序就可以使用String结构体作为全局的数据存储区,用于存放多个key-value对。

第二行代码为String结构体增加了一个length属性,通过getter和setter部分可以实现访问和设置字符串的长度。

10.使用扩展添加方法:使用扩展既可以添加实例方法,也可以添加类型方法,只是添加类型方法时需要在类型方法前添加static或class,

11.举个栗子:

extension String

{

//添加一个新的实例方法,用于获取当前字符串中指定范围的子串

func subStringFromStart(start : Int, toEnd : Int) -> String

{...}

//定义一个类方法,该类方法用于将Bool值转换为字符串

static func valueOf(value : Bool) -> String

{

return "\(value)"

}

}

12.使用扩展添加可变方法:可变方法可以改变值类型的实例本身————类不可以定义可变方法,因此也不能通过扩展为类添加可变方法。举个栗子:

extension Array

{

//定义一个方法,用于计算数组的交集

mutating func retainAll(Array : [T], compartor : (T, T) -> Bool)

{ ... }

}

13.使用扩展添加类构造器:通过扩展添加的构造器不会影响类型中原有的构造器----如果希望系统提供的默认构造器和程序定义的构造器并存,则需要使用扩展,并在扩展中添加构造器,这样就不会影响系统提供的默认构造器了。

14.举个栗子:

//定义一个结构体,该结构体不包含任何构造器,系统将为之提供一个默认构造器

struct SomeStruct

{

var name:String

var count : Int

}

//使用扩展来添加构造器

extension SomeStruct

{

//通过扩展添加的2个构造器对该类型原有的构造器没有影响

init(name : String)

{

self.name = name

self.count = 0

}

init(count : Int)

{

self.count = count

self.name= ""

}

}

15.使用扩展还可以添加下标和嵌套类型,一旦通过扩展添加了下标和嵌套类型之后,程序就可以像之前的普通类型那样使用它们。

相关文章

网友评论

      本文标题:每天学一点Swift----面向对象下(五)

      本文链接:https://www.haomeiwen.com/subject/qeafqxtx.html